我以前从未使用过导航属性,所以我试图了解它们是如何工作的。我更喜欢通过流畅的API来映射它们作为优先选择。有人可以向我解释如何使用流畅的API设置这种关系吗?
public class FooA
{
[Key]
public int FooAID {get;set;}
[Required]
public String NameA {get;set;}
}
public class FooB
{
[Key]
public int FooBID {get;set;}
[Required]
public String NameB {get;set;}
public int? FooA_FK1 {get;set;}
public int? FooA_FK2 {get;set;}
[ForeignKey("FooA_FK1")]
public virtual FooA Nav_FK1{get;set;}
[ForeignKey("FooA_FK2")]
public virtual FooA Nav_FK2{get;set;}
}
/*
Note that FooB has TWO NULLABLE (Optional?) references to FooA objects.
Also, the foreign key names don't follow the convention for EF.
I want to understand the fluent API used to construct this type of relationship.
I have been able to use fluent API to get this set up provided that the items
are required. When I tried using the .HasOptional() method, I got an exception.
*/
答案 0 :(得分:2)
使用该模型,您将创建两个一对多关系,但两者都是单向关系(您不能在其中一个关系结束时声明导航属性)。在您的上下文中覆盖OnModelCreating
方法的等效Fluent Api配置是:
modelBuilder.Entity<FooB>().HasOptional(fb=>fb.Nav_FK1).WithMany().HasForeignKey(fb=>fb.FooA_FK1);
modelBuilder.Entity<FooB>().HasOptional(fb=>fb.Nav_FK2).WithMany().HasForeignKey(fb=>fb.FooA_FK2);
在此link中,您将找到有关如何使用Fluent Api创建不同类型关系的更多信息。
答案 1 :(得分:1)
如果您的外键可以为空,则可以在流畅的api关系定义中使用HasOptional
:
HasOptional(a => a.Nav_FK1).WithMany().HasForeignKey(b => b.FooA_FK1);
HasOptional(a => a.Nav_FK2).WithMany().HasForeignKey(b => b.FooA_FK2);