【问题标题】:EF Code First Additional column in join table for ordering purposes连接表中的 EF Code First 附加列用于排序
【发布时间】:2011-09-02 21:00:28
【问题描述】:

我有两个具有关系的实体,我为其创建了一个连接表

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Image> Images { get; set; }
}


public class Image
{
    public int Id { get; set; }
    public string Filename { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

        modelBuilder.Entity<Student>()
            .HasMany(i => i.Images)
            .WithMany(s => s.Students)
            .Map(m => m.ToTable("StudentImages"));
}

我想添加一个额外的列以允许按时间顺序排列 StudentImages。

我应该在哪里添加插入相关代码?

【问题讨论】:

    标签: entity-framework-4.1


    【解决方案1】:

    您想在您的应用程序中使用该新列吗?在这种情况下,您不能对您的模型执行此操作。多对多关系仅在联结表不包含主表外键以外的任何内容时才有效。一旦添加了向应用程序公开的附加列,联结表就会像任何其他实体一样成为实体 = 您需要第三类。您的模型应如下所示:

    public class StudentImage 
    {
        public int StudentId { get; set; }
        public int ImageId { get; set; }
        public int Order { get; set; }
        public virtual Student Student { get; set; }
        public virtual Image Image { get; set; }
    }
    
    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<StudentImage> Images { get; set; }
    }
    
    
    public class Image
    {
        public int Id { get; set; }
        public string Filename { get; set; }
        public virtual ICollection<StudentImage> Students { get; set; }
    }
    

    而且你的映射也必须改变:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<StudentImages>().HasKey(si => new { si.StudentId, si.ImageId });
    
        // The rest should not be needed - it should be done by conventions
        modelBuilder.Entity<Student>()
                    .HasMany(s => s.Images)
                    .WithRequired(si => si.Student)
                    .HasForeignKey(si => si.StudentId); 
        modelBuilder.Entity<Image>()
                    .HasMany(s => s.Students)
                    .WithRequired(si => si.Image)
                    .HasForeignKey(si => si.ImageId); 
    }
    

    【讨论】:

    • 嗯,这意味着我将失去对 Student.Images 等的访问权限。我想知道我是否可以保留我目前拥有的内容并创建一个单独的 StudentImagesOrder 实体并让代码首先创建它并存储此信息那里?
    • 一年后遇到同样的问题,这是谷歌搜索它时最热门的问题之一 - 我想知道它是否仍然是当前的实现,当添加额外的列时,我会丢失很多很多关系。 (在这种情况下 student.images ?)
    • @s093294:是的,情况是一样的,不会改变。如果向联结表添加新列,则需要一个新实体而不是直接多对多关系才能访问新列。
    • 我在没有告诉 EF 的情况下添加了额外的列,并在需要时实现了一些存储过程。
    • @LadislavMrnka 它在我的数据库中创建了一个附加表,其中包含双方的键。类似于没有附加列的联结表。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多