3

我正在使用最新的实体框架,当我想创建一个额外的列时遇到了多对多关系的问题。

这个问题与这篇较早的帖子中提出的问题相同: EF Code First Additional column in join table for ordering purpose

今天是否仍然存在问题,即不能在不丢失多对多关系的情况下添加额外的列(从对象 A 到 B 的链接为 AB,因为映射变成了它自己的实体)?

什么是工作?

  1. 查找类AI需要的a,然后查询映射表where(e=>e.A == a)得到我的Bs?当我需要额外的列时,我会做MappingTable.find(a,b)什么?
  2. 还有其他建模选项,linq to sql 可以使它更容易吗?
4

2 回答 2

0

据我所知,EF 5 并没有改变。您需要按照链接所述进行操作。我喜欢坚持使用 EF,因为它易于使用,但这只是我的意见......

于 2012-10-01T00:50:21.683 回答
0

我有同样的问题。我为解决它所做的工作是创建另一个专门用于处理连接的派生 DbContext。IE:

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;
    }
}

希望这可以帮助!

于 2013-07-31T17:12:04.883 回答