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"));