我在设置数据库所需的正确关系时遇到了一些问题。
用言语...... 我希望有一个公司,可以多个(零:很多)分支
在公司上我希望能够指定 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或一种类型关系
答案 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();
}
这会创建:
如果您想更改密钥的名称,您需要在流利地图的末尾添加映射:
modelBuilder.Entity<Firm>()
.HasOptional(f => f.HeadOffice)
.WithOptionalDependent()
.Map(m => m.MapKey("YourKeyName"));