EF Code First多对多关系在链接表中存储附加数据

时间:2011-05-23 18:57:40

标签: c# entity-framework ef-code-first

如果我将两个实体关联为多对多关系,如何在我自动创建的“链接表”中存储其他字段?

我尝试过去“两个1对多个关联” - 但是我很难正确配置级联删除。

3 个答案:

答案 0 :(得分:0)

除非数据库级别的某些函数或过程使用了这些额外的列,否则链接表中的额外列将无用,因为它们在实体框架级别完全不可见。

听起来你需要重新思考你的对象模型。如果您绝对需要这些列,您可以随后手动添加它们。

答案 1 :(得分:0)

您很可能需要在域模型中公开关联。

例如,我需要针对多对多关系(项目<>图像)中的项目存储索引(显示顺序)。

这是关联类:

public class ProjectImage : Entity
{
    public Guid ProjectId { get; set; }
    public Guid ImageId { get; set; }
    public virtual int DisplayIndex { get; set; }       
    public virtual Project Project { get; set; }
    public virtual Image Image { get; set; }
}

这是映射:

public class ProjectImageMap : EntityTypeConfiguration<ProjectImage>
{
    public ProjectImageMap()
    {
        ToTable("ProjectImages");
        HasKey(pi => pi.Id);
        HasRequired(pi => pi.Project);
        HasRequired(pi => pi.Image);
    }
}

从项目地图:

HasMany(p => p.ProjectImages).WithRequired(pi => pi.Project);

在项目上映射到以下属性:

public virtual IList<ProjectImage> ProjectImages { get; set; }

希望有所帮助

答案 2 :(得分:0)

假设两种类型之间存在多对多关联:User和Message,关联类定义为具有其他属性的UserMessageLink。

public class User {
    public int Id {get;set;}
}

public class Message {
    public int Id {get;set;}
}

//The many-to-many association class with additional properties
public class UserMessageLink {
    [Key]
    [Column("RecieverId", Order = 0)]
    [ForeignKey("Reciever")]
    public virtual int RecieverId { get; set; }

    [Key]
    [Column("MessageId", Order = 1)]
    [ForeignKey("Message")]
    public virtual int MessageId { get; set; }

    public virtual User Reciever { get; set; }
    public virtual Message Message { get; set; }

    //This is an additional property
    public bool IsRead { get; set; }
}