实体框架表每个类/类型,派生类之间的多对多关系

时间:2013-07-08 03:53:55

标签: entity-framework ef-code-first many-to-many entity-framework-5 abstract

我有以下类层次结构:

public abstract class Approver
{        
    [Key]
    public int Id { get; set; }

    [Required]
    public String ApproverName { get; set; }
}

[Table("Role")]
public class Role : Approver
{
    public virtual string Description { get; set; }

    public virtual ICollection<User> Users { get; set; }
} 

[Table("User")]    
public class User : Approver
{
    [Required]
    public virtual String Email { get; set; }

    [Required, DataType(DataType.Password)]
    public virtual String Password { get; set; }

    public virtual String FirstName { get; set; }
    public virtual String LastName { get; set; }

    public virtual ICollection<Role> Roles { get; set; }
{

以下代码位于OnModelCreating()方法中:

modelBuilder.Entity<User>().HasMany(e=>e.Roles).WithMany(e=>e.Users);

运行'Update-Database'命令时出错:

  

System.Data.Entity.Infrastructure.DbUpdateException:从ObjectStateEntry中检索值时出错。请参阅内部异常了解详细信---&GT; System.Data.UpdateException:从ObjectStateEntry检索值时出错。请参阅内部异常了解详细信---&GT; System.Data.MappingException:   (11,10):错误3034:从第11,966行开始映射片段时出现问题:具有不同键的两个实体映射到同一行。确保这两个映射片段不会将具有不同键的两组实体映射到两个重叠的行组。

     

(11,10):错误3034:从第6,11行开始映射片段时出现问题:具有不同键的两个实体映射到同一行。确保这两个映射片段不会将具有不同键的两组实体映射到同一组行。

     

(966,6):错误3034:从第6,966行开始映射片段时出现问题:具有不同主键的两行映射到同一实体。确保这两个映射片段不会将具有相同键的两组实体映射到两个重叠的行组。

似乎存在类似的已知问题(至少在EF5之前),并非完全相同的情况,提及herehere

任何见解都是有价值的。

更新:

问题似乎是将实体添加到数据库中。在Seed方法中如下(非常简化,这里我只是添加角色):

    GetDefaultUsersAndRoles(out defaultUsers, out roleNames);

            foreach (var roleName in roleNames)
            {
                Role roleToAdd = new Role
                {
                    ApproverName = roleName
                };

                context.Roles.Add(roleToAdd);
             }

             context.SaveChanges();

1 个答案:

答案 0 :(得分:0)

现在已经解决了。这是一个外键映射问题:

                modelBuilder.Entity<User>().HasMany<Role>(r => r.Roles).WithMany(u => u.Users);