我需要建立一个目前是一对多的关系:
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);
}
然而,实际上,Bar只能分配给一个Foo。是否可以设置它,所以我在Bar中有一个Foo导航属性而不是Foos的集合?我仍然希望我的表格呈现:
Foos
- FooId
- BarId (null)
- ...
Bars
- BarId
- ...
我想要我的课程:
Foo
- FooId
- BarId
- ...
- Bar
Bar
- BarId
- ...
- Foo
我一直在使用WithOptionalDependant和WithOptionalPrincipal摆弄,但找不到正确的组合。任何帮助表示赞赏!
答案 0 :(得分: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"));
这将为您提供您在帖子中显示的数据模型。