EF CF:与其他信息的多对多关系

myn*_*kow 3 entity-framework ef-code-first entity-framework-4.1

我们有遗留数据库,我们将新对象和道具映射到旧表和列.到现在为止还挺好.我们有成功映射的多对多关系.中间表包含其他数据.当我们尝试将中间表映射到对象时,我们得到了已定义映射的异常.如果我们从关系的任何一侧删除映射,我们会得到表缺失的错误(ofc,我们期待那样).我可以使用NHibernate轻松地做到这一点,我开始认为EF缺少真正的很多功能.那么,请告诉我,我错了,我们可以用EF做到这一点.

最好的祝福

编辑:这是一个失败的虚拟样本.

class User
{
  public ICollection<User> Followers{get;set;}
}

class UserRelation
{
  public User User{get;set;}
  public User Follower{get;set;}
  public DateTime CreatedOn{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

用户映射

modelBuilder
     .Entity<User>()
     .HasMany<User>(user => user.Followers)
     .WithMany()
     .Map(m =>m.MapLeftKey("user_id").MapRightKey("follower_id")
     .ToTable("user_follower"));
Run Code Online (Sandbox Code Playgroud)

用户关系映射

modelBuilder
     .Entity<UserRelation>()
     .ToTable("user_follower");

modelBuilder
     .Entity<UserRelation>()
     .HasOptional<User>(f => f.User)
     .WithRequired().Map(m => m.MapKey("user_id"));

modelBuilder
     .Entity<UserRelation>()
     .HasOptional<User>(f => f.Follower)
     .WithRequired().Map(m => m.MapKey("follower_id"));

modelBuilder
     .Entity<UserRelation>()
     .Property(entity => entity.CreatedOn)
     .HasColumnName("created_on");
Run Code Online (Sandbox Code Playgroud)

例外

指定的架构无效.错误:(67,6):错误0019:已定义具有架构'dbo'和表'user_follower'的EntitySet'UserUser'.每个EntitySet必须引用唯一的模式和表.

Edit2:以下是此模型的另一个示例:http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/

Lad*_*nka 10

仅当联结表包含外键时,才能使用直接多对多映射.如果要在联结表中公开其他属性,则必须将其映射到单独的实体,并与多对多中使用的前实体保持两个一对多关系.

我实际上无法给你写代码,因为我不明白你的例子.

仅尝试(不要在用户中映射多对多):

modelBuilder.Entity<UserRelation>
    .HasRequired(r => r.User)
    .WithMany(u => u.Followers);

modelBuilder.Entity<UserRelation>
    .HasRequired(r => r.Follower)
    .WithMany();
Run Code Online (Sandbox Code Playgroud)