繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM