实体框架-如何插入到多对多表与额外的属性

本文关键字:属性 框架 何插入 插入 实体 | 更新日期: 2023-09-27 18:08:17

我有两个实体

项目实体

[Table("Project")]
public class Project
{
    public Project()
    {
        Participants = new List<Participation>();
    }
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    [StringLength(225)]
    [Index(IsUnique=true)]
    public string Name { get; set; }
    public ProjectVisibility Visibility { get; set; }
    public virtual List<Participation> Participants { get; set; }
}

和UserProfile实体

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public virtual List<Participation> Participations { get; set; }

}

每个用户都可以参与一个具有不同访问级别的项目,因此在链接表中我不仅存储了2个id,而且还存储了访问级别的第3个属性。(可访问性只是一个具有1/2/3/4可用值的枚举)如下:

 [Table("Participations")]
public class Participation
{
    public virtual Project ProjectReference { get; set; }
    public virtual UserProfile UserReference { get; set; }
    [Key, Column(Order = 0)]
    public int ProjectID { get; set; }
    [Key, Column(Order = 1)]
    public int UserID { get; set; }
    public Accessibility AccessLevel { get; set; }
}

我正在尝试创建一个新的项目,并分配当前用户作为项目的所有者,但我不断得到不同类型的错误。以下是我的"CreateProject"代码:

public void CreateProject(Project model, UserProfile owner)
    {
        var participation = new Participation { ProjectReference = model, UserReference = owner, AccessLevel = Accessibility.Owner };
        Participations.Add(participation);
        Projects.Add(model);
        SaveChanges();
    }
谁能告诉我该怎么做呢?

实体框架-如何插入到多对多表与额外的属性

添加外键属性,告知EF键和导航属性之间的关系:

[Table("Participations")]
public class Participation
{
    [ForeignKey("ProjectID")]
    public virtual Project ProjectReference { get; set; }
    [ForeignKey("UserID")]
    public virtual UserProfile UserReference { get; set; }
    [Key, Column(Order = 0)]
    public int ProjectID { get; set; }
    [Key, Column(Order = 1)]
    public int UserID { get; set; }
    public Accessibility AccessLevel { get; set; }
}

还要确保您已将项目和用户附加到当前上下文。否则EF将以与根参与实体相同的状态添加它们,即具有Added状态。EF将把所有实体视为新添加的,并将尝试将它们插入数据库。