首先与实体框架代码建立多个一对多关系

时间:2014-12-11 09:19:51

标签: c# entity-framework ef-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);

我最初使用模型构建器创建了关系,指定了左右键(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个实体中的虚拟属性是正确的,但我觉得我的模型构建器逻辑可能会稍微错误配置?

1 个答案:

答案 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按预期工作。