0

我有以下类层次结构:

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

运行“更新数据库”命令时的错误是:

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

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

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

似乎有一个类似的已知问题(至少在 EF5 之前),不完全相同的场景,在此处此处提到。

任何见解都是有价值的。

更新:

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

    GetDefaultUsersAndRoles(out defaultUsers, out roleNames);

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

                context.Roles.Add(roleToAdd);
             }

             context.SaveChanges();
4

1 回答 1

0

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

                modelBuilder.Entity<User>().HasMany<Role>(r => r.Roles).WithMany(u => u.Users);
于 2013-07-09T23:22:29.597 回答