具有流畅API的EF导航属性

时间:2015-08-17 13:01:11

标签: c# entity-framework ef-fluent-api

我以前从未使用过导航属性,所以我试图了解它们是如何工作的。我更喜欢通过流畅的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.

*/

2 个答案:

答案 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);

参考:http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx