我正试图建立一种从选择性到选择性的关系。我认为我已经非常接近了,但是由于某种原因,实体框架无法在我的实体上使用预定义的fk属性。
public class Foo
{
public Guid? BarId { get; set; }
public virtual Bar Bar { get; set; }
}
public class Bar
{
public virtual Foo Foo { get; set; }
}
这正是我想在数据库中看到的。foo有一个fk列,但bar没有fk to foo。
以及Fluent API:
modelBuilder
.Entity<Foo>()
.HasOptional(f => f.Bar)
.WithOptionalDependent(b => b.Foo);
但是,当我生成数据库时,ef已经设置了
FooId
属性作为简单的标量属性,并创建了自己的
Foo_Id
它用于FK。
其他一切都如我所料,
Bar
表没有FK字段到
Foo
.
在网上查找时,我发现了一个建议,可以执行以下操作:
modelBuilder
.Entity<Foo>()
.HasOptional(f => f.Bar)
.WithOptionalDependent(b => b.Foo)
.Map(d => d.MapKey("BarId"));
但是,除非我移除
BarId
从我的
福
上课,我不想那样做。我特别想保留
巴里德
所以我可以在需要的时候使用它来创建/破坏关系。
如何让ef使用我创建的fk属性,而不是生成一个额外的列并使用它?
旁注:我不想使用数据注释。整个解决方案是围绕将实体(域项目)与数据提供程序(数据库EF项目)分离而构建的。我们只使用Fluent API来设置所有这些。
为了完整起见,目的是
酒吧
可以有多个这样的关系:
public class ADifferentFoo
{
public Guid? BarId { get; set; }
public virtual Bar Bar { get; set; }
}
这就是为什么我不想让FK出现在酒吧里的原因:你最终会为每个人都写一个专栏,我们知道一个酒吧只有一个关系。
也许一个具体的例子有助于:
福
=
Person
酒吧
=
Picture
ADifferentFoo
=
Car
一个人可以选择有一张照片。汽车可以有选择地有一张图片。
图片总是属于任何一辆车
异或
一个人,不可能两者兼而有之。
但就我所关心的,这不需要在数据库级别上显式地强制执行。业务逻辑可以处理这个问题。
同样,我不在乎没有车或人的照片-我不需要它们,但如果数据模型允许它们存在,这不是问题。业务逻辑也将覆盖这个缺口。