我正在尝试在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
属性。
提前致谢。
答案 0 :(得分:2)
您不能拥有2个具有相同名称的键,它将代表您的关系表的列(名为“UserGroups”)。当您调用“MapLeftKey”或“MapRightKey”时,您可以定义列名称。
所以我建议你重命名你的ID(例如UserId和GroupId),你的映射应该没问题。我认为你无法使用流畅的API提供另一种解决方案。