Entity framework 实体框架流畅映射可选一对一

Entity framework 实体框架流畅映射可选一对一,entity-framework,mapping,fluent,Entity Framework,Mapping,Fluent,我需要建立一种当前为一对多的关系: 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 ICollecti

我需要建立一种当前为一对多的关系:

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);
}
我希望我的课程是:

Foo
- FooId
- BarId
- ...
- Bar

Bar
- BarId
- ...
- Foo

我一直在摆弄OptionalDependent和OptionalPrincipal,但找不到正确的组合。感谢您的帮助

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

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

如果您有
Foo.BarId
,它应该有一个唯一的约束,以确保它在FK关联中只使用一次。因此,您最好使用已经可用的唯一字段,即主键

编辑

我不清楚你是否希望协会的双方都可以选择。您可以通过(在
条形图中
)实现:


这将为您带来您在文章中展示的数据模型。

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

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

如果您有
Foo.BarId
,它应该有一个唯一的约束,以确保它在FK关联中只使用一次。因此,您最好使用已经可用的唯一字段,即主键

编辑

我不清楚你是否希望协会的双方都可以选择。您可以通过(在
条形图中
)实现:


这为您带来了您在帖子中展示的数据模型。

不幸的是,Foo不需要有一个Bar,相反,Bar也不需要有一个Foo,所以我认为这不管用。差不多就到了!不幸的是,我的Foo类上不能有一个属性BarId,因为它与映射键冲突。这不是完全必要的,但那会很好。我过去一直使用HasForeignKey()方法映射键和引用的类,WithOptionalPrincipal()中不提供该方法。该方法似乎不受支持。我从来没注意到。我想不出有什么理由不支持它,因为它是一对多的。它是一个表演停止者吗?不,不是一个表演停止者。我只需要在select LINQ语句中再导航一个级别。我唯一关心的是延迟加载。如果我已经加载了Foo,我不想为了从Foo对象中获取BarId而不得不延迟加载Bar。大多数时候,我都是从datacontext中选择一个模型类,它已经按我所希望的方式展开了,所以这可能不是一个真正的问题。但FK属性在一对多而不是一对一中得到支持似乎有些奇怪。不幸的是,Foo不需要有一个Bar,相反,Bar不需要有一个Foo,所以我认为这不起作用。几乎就在那里!不幸的是,我的Foo类上不能有一个属性BarId,因为它与映射键冲突。这不是完全必要的,但那会很好。我过去一直使用HasForeignKey()方法映射键和引用的类,WithOptionalPrincipal()中不提供该方法。该方法似乎不受支持。我从来没注意到。我想不出有什么理由不支持它,因为它是一对多的。它是一个表演停止者吗?不,不是一个表演停止者。我只需要在select LINQ语句中再导航一个级别。我唯一关心的是延迟加载。如果我已经加载了Foo,我不想为了从Foo对象中获取BarId而不得不延迟加载Bar。大多数时候,我都是从datacontext中选择一个模型类,它已经按我所希望的方式展开了,所以这可能不是一个真正的问题。但FK属性在一对多Y中受支持,而不是一对一中受支持,这似乎很奇怪。
Foo
- FooId
- BarId
- ...
- Bar

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