[英]Multiple one-to-many relationships with entity framework code first
我正在尝试以1对多的基础将2个表与第3个表建立关系。 我有以下代码:
public class CompanyInvolvement
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
public DateTime StartDate { get; set; }
public DateTime? EndDate { get; set; }
public virtual Person Person { get; set; }
public virtual Company Company { get; set; }
}
public class Person
{
public Person()
{
CompanyInvolvements = new Collection<CompanyInvolvement>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
public string ClientIdReference { get; set; }
public virtual ICollection<CompanyInvolvement> CompanyInvolvements { get; set; }
}
public class Company
{
public Company()
{
Involvements = new Collection<CompanyInvolvement>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
public string ClientIdReference { get; set; }
[Required]
public string CompanyName { get; set; }
public virtual ICollection<CompanyInvolvement> Involvements { get; set; }
}
因此,一个人可以有效地参与公司的很多事务,而公司可以有很多人参与其中。 模型构建器的用法如下:
modelBuilder.Entity<CompanyInvolvement>().HasRequired(x => x.Person).WithMany(x => x.CompanyInvolvements);
modelBuilder.Entity<CompanyInvolvement>().HasRequired(x => x.Company).WithMany(x => x.Involvements);
我最初使用modelbuilder创建了关系,并指定了左右键(CompanyId和PersonId),并且效果很好。 但是现在我需要参与的开始日期和结束日期,我想我需要创建一个专门的实体。
问题:使用上述结构时,我可以创建和读出公司的涉事人员,也可以查看人的涉事人员。 但是,当我尝试执行以下操作时:
var person = _context.People.FirstOrDefault(x => x.Id == personId);
var involvement = company.Involvements.FirstOrDefault(x => x.Person == person );
company.Involvements.Remove(involvement);
_context.SaveChanges();
我收到以下错误:
“ CompanyInvolvement_Company” AssociationSet中的关系处于“已删除”状态。 给定多重性约束,相应的“ CompanyInvolvement_Company_Source”也必须处于“已删除”状态。
我认为我在3个实体中的虚拟属性是正确的,但是我感觉到我所拥有的Modelbuilder逻辑可能配置有误?
我终于弄清楚我在做什么错。 我需要从CompanyInvolvement实体中删除Id属性,并添加以下组合键:
[Key, Column(Order = 0)]
public Guid PersonId { get; set; }
[Key, Column(Order = 1)]
public Guid CompanyId { get; set; }
按照惯例,我猜这两个属性分别作为外键链接到Person和Company实体。 我还删除了原始问题中所述的modelbuilder映射。 完成这些操作后,删除CompanyInvolvements即可按预期工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.