实体框架5.0中的多对多关系的额外列进行了审核

时间:2012-10-01 00:03:11

标签: entity-framework

当我想创建一个额外的列时,我正在使用最新的Entity Framework并遇到了Many To Many Relationship的问题。

这个老帖子提出了同样的问题: EF Code First Additional column in join table for ordering purposes

今天仍然存在的问题是,如果不丢失多对多关系,就无法添加额外的列(从对象A到B的链接为A.B,因为映射变为实体并且是自己的实体)?

一轮的工作是什么?

  1. 查找我需要的A类,然后查询映射表where(e=>e.A == a)以获取我的B?当我需要额外的colums时,我会MappingTable.find(a,b)
  2. 是否还有其他建模选项,linq to sql会让它变得更容易?

2 个答案:

答案 0 :(得分:0)

据我所知,EF 5没有改变。你需要按照链接说的那样去做。我喜欢坚持EF易于使用,但这只是我的意见......

答案 1 :(得分:0)

我遇到了同样的问题。我为解决这个问题所做的是创建另一个衍生的DbContext来专门处理连接。即:

public class JoinContext : DbContext
{
    internal JoinContext() : base("name=SampleConnectionString")
    {
        PreventErrorIfDatabaseSchemaChanges();

        // Get the ObjectContext related to this DbContext
        var objectContext = (this as IObjectContextAdapter).ObjectContext;
    }

    public DbSet<StudentImage> StudentImages { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<StudentImage>()
            .ToTable("StudentImages");
            .HasKey(joinTable => new { joinTable.StudentId, joinTable.ImageId });

        base.OnModelCreating(modelBuilder);
    }
    private static void PreventErrorIfDatabaseSchemaChanges()
    {
        Database.SetInitializer<JoinContext>(null);
    }
}

我将其他应用程序上下文保留为Student / Image多对多连接映射。不要忘记为连接表指定一个复合键(参考上面的HasKey方法),否则在数据库初始化时指定EF炸弹。

获得特殊连接上下文后,使用存储库访问此上下文并从映射连接表中获取或设置所需字段:

public class StudentRepository
{
    public int GetImageSortOrder(int studentId, int imageId)
    {
        var joinContext = new JoinContext();

        var joinTuple = joinContext.StudentImages.Find(studentId, imageId);

        return joinTuple.SortOrder;
    }
}

希望这有帮助!