EF - 双向具有相同映射属性的多对多配置

时间:2014-05-12 12:54:39

标签: c# entity-framework entity-framework-6

我正在尝试在User和Group模型之间创建多对多映射。这是我的课程:

public abstract class Entity
{
    public Guid Id { get; set; }
    public DateTime Created { get; set; }
    public DateTime? Modified { get; set; }
}

public class User : Entity
{
    public string Email { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Group> Groups { get; set; }
}

public class Group : Entity
{
    public string Name { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

如您所见,我正在使用Entity抽象类来实现从它继承的类中的公共属性。在这种情况下,Id将是我所有EF类的关键属性。

这是我的配置文件,其中我映射了多对多关系:

public GroupConfiguration()
{
    Property(x => x.Id).IsRequired().HasDatabaseGeneratedOption(databaseGeneratedOption: DatabaseGeneratedOption.Identity);
    Property(x => x.Name).HasMaxLength(50).IsRequired();

    HasMany(g => g.Users)
        .WithMany(u => u.Groups)
        .Map(m =>
        {
            m.MapLeftKey("Id");
            m.MapRightKey("Id");
            m.ToTable("UserGroups");
        });
}

当我尝试添加迁移时,我收到以下错误:Id: Name: Each property name in a type must be unique. Property name 'Id' is already defined.它似乎不喜欢双面映射的属性具有相同标识符的事实。当我没有从Entity继承其中一个类时,例如。 User,并使映射属性UserId能够成功创建迁移。

这有什么办法吗?它将能够为抽象类中定义的所有实体使用Id属性。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您不能拥有2个具有相同名称的键,它将代表您的关系表的列(名为“UserGroups”)。当您调用“MapLeftKey”或“MapRightKey”时,您可以定义列名称。

所以我建议你重命名你的ID(例如UserId和GroupId),你的映射应该没问题。我认为你无法使用流畅的API提供另一种解决方案。