实体框架流利的映射可选一到一(Entity Framework Fluent Mapping Opt

2019-08-19 06:41发布

我需要建立一个关系,这是目前的一到多:

public class Foo
{
    public int FooId { get; set; }
    public int? BarId { get; set; }
    ...
    public virtual Bar Bar { get; set; }
}

public class Bar
{
    public int BarId { get; set; }
    ...
    public virtual ICollection<Foo> Foos { get; set; }
}

public FooMap()
{
    HasKey(e => e.FooId);
    Property(e => e.FooId.IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    Property(e => e.BarId).IsOptional();
    ...
    HasOptional(e => e.Bar).WithMany(Foos).HasForeignKey(e => e.BarId);
}

public BarMap()
{
    HasKey(e => e.BarId);
    Property(e => e.BarId.IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    ...
    HasMany(e => e.Foos).WithOptional(e => e.Bar).HasForeignKey(e => e.BarId);
}

然而,在现实中,律师只能被分配到一个富。 是否有可能设置这让我有在酒吧一个富导航属性,而不是FOOS的集合? 我还是希望我的表格来呈现:

Foos
- FooId
- BarId (null)
- ...

Bars
- BarId
- ...

我想我的课是:

Foo
- FooId
- BarId
- ...
- Bar

Bar
- BarId
- ...
- Foo

我一直在摆弄周围有WithOptionalDependant和WithOptionalPrincipal,但无法找到正确的组合。 任何帮助表示赞赏!

Answer 1:

建模可选1的常用方法:1关联是(在FooMap

HasOptional(f => f.Bar).WithRequired(b => b.Foo);

但它不会产生你想要的模型。 它不需要Foo.BarId ,因为Bar.BarId既是一个主键和外键Foo.FooId

如果你有Foo.BarId它应该有一个唯一约束,以确保其在FK联想只能使用一次。 所以,你不妨使用已经可用的唯一领域,主键。

编辑

目前还不清楚,我认为你想关联的双方是可选的。 你可以做到这一点通过(在BarMap ):

HasOptional(b => b.Foo).WithOptionalPrincipal(f => f.Bar)
                       .Map(m => m.MapKey("BarId"));

这为您带来您在您的文章显示的数据模型。



文章来源: Entity Framework Fluent Mapping Optional One-To-One