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

时间:2011-03-22 13:03:51

标签: 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;}
}

用户映射

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

用户关系映射

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");

异常

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

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

2 个答案:

答案 0 :(得分:10)

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

我实际上无法为您编写代码,因为我不理解您的示例。

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

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

modelBuilder.Entity<UserRelation>
    .HasRequired(r => r.Follower)
    .WithMany();

答案 1 :(得分:1)

EF将多对多关系映射为相关对象的属性。

所以,假设你有CarsDrivers与m-to-n相关。在EF模型中,您将看到每个Car对象都有一个Drivers集合作为属性,每个Driver对象都有一个Cars集合作为属性。

这就是在EF中建模m-to-n关系的方式。