在Code First EF中创建相互引用的关系

时间:2012-09-05 15:56:07

标签: entity-framework ef-code-first relationships

我在设置数据库所需的正确关系时遇到了一些问题。

用言语...... 我希望有一个公司,可以多个(零:很多)分支

公司上我希望能够指定 HeadOffice ,它将存在于分支表中(零:一)< / p>

我希望看到公司表格包含以下字段:Id,Name,HeadOfficeId以及分支我希望看到:Id,TradingAs,姓名,Firm_Id

相反,我看到了:

公司表包含以下字段:Id,Name,HeadOfficeId

分支机构我希望看到:ID,TradingAs,Name,Firm_Id,Firm_Id1

模型类如图所示

public class Firm
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Branch> FirmBranches { get; set; }

    public virtual LawFirmBranch HeadOffice { get; set; }
}

public class Branch
{
    public int Id { get; set; }
    public string TradingAs {get;set;}
    public string Name {get;set;}


    public Firm Firm { get; set; }

}

我知道这会导致循环引用类型问题,我很高兴将Firm HeadOffice初始化为Null,直到FirmBranches属性中有值。

是否有某种方法可以指定HeadOffice具有null或一种类型关系

1 个答案:

答案 0 :(得分:1)

如果您想在模型中明确地执行此操作,可以通过数据注释执行此操作:

公共类公司 {     public int Id {get;组; }     public string Name {get;组; }

public virtual ICollection<Branch> FirmBranches { get; set; }

[ForeignKey("HeadOffice")]
public int? FirmId {get;set;}

public virtual LawFirmBranch HeadOffice { get; set; }

}

如果您不想在代码中公开这些内容,则需要通过流畅的方式执行此操作:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Firm>()
            .HasOptional(f => f.HeadOffice)
            .WithOptionalDependent();
    }

这会创建:

enter image description here

如果您想更改密钥的名称,您需要在流利地图的末尾添加映射:

        modelBuilder.Entity<Firm>()
            .HasOptional(f => f.HeadOffice)
            .WithOptionalDependent()
            .Map(m => m.MapKey("YourKeyName"));