我试图在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);
我最初使用模型构建器创建了关系,指定了左右键(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的关系是 处于'已删除'状态。给定多重约束,a 相应的'CompanyInvolvement_Company_Source'也必须在 '已删除'状态。
我认为我在3个实体中的虚拟属性是正确的,但我觉得我的模型构建器逻辑可能会稍微错误配置?
答案 0 :(得分:1)
我终于弄清楚我做错了什么。我需要从CompanyInvolvement实体中删除Id属性并添加以下复合键:
[Key, Column(Order = 0)]
public Guid PersonId { get; set; }
[Key, Column(Order = 1)]
public Guid CompanyId { get; set; }
我猜测,按惯例,这两个属性分别作为外键链接到Person和Company实体。我还删除了原始问题中所述的模型构建器映射。完成这些操作后,删除CompanyInvolvements按预期工作。