【问题标题】:EF Code First Many to many relation store additional data in link tableEF Code First 多对多关系在链接表中存储附加数据
【发布时间】:2011-05-23 18:57:39
【问题描述】:

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

我尝试过“两个 1 到多个关联”的路线,但我很难正确配置级联删除。

【问题讨论】:

  • 显示您的映射代码,以便我们找出问题所在。
  • 如果您的“关联”具有属性,那么它就是一个实体...想想您将如何通过导航属性访问这些字段。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    这是关联类:

    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 =&gt; p.ProjectImages).WithRequired(pi =&gt; pi.Project);

    映射到项目的以下属性:

    public virtual IList&lt;ProjectImage&gt; ProjectImages { get; set; }

    希望有帮助

    【讨论】:

    • 我明白了,但是在添加记录时,您实际上是如何使用这种多对多的呢?例如,我想创建一个新项目。我会做 var proj = new Project { ProjectImage = ??? };是什么让 ctx.Projects.Add(proj) 调用起作用?
    【解决方案3】:

    假设两个类型之间存在多对多关联: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; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多