Entity Framework 7 创建迁移时遇到问题,因为存在具有相同名称的导航 属性

Entity Framework 7 trouble creating migration because navigation property with the same name exists

我正在尝试使用 Entity Framework 7 代码优先开发创建我的第一个迁移,但出现以下错误:

The property 'Email' cannot be added to the entity type 'UserDTO' because a navigation property with the same name already exists on entity type 'UserDTO'.

我的环境是: 1) Visual Studio 2015 年 2) Entity Framework v7.0.0-rc1-最终版本 3)代码优先开发 4) 使用流利的API,而不是数据注释

我无法弄清楚问题的根本原因是什么,但我有一些想法。我的 RoleDTO class 应该使用其电子邮件地址 属性 作为其 PK,并且它还有一个 RoleDTO 对象集合作为 属性.

下面是我目前唯一从 DbContext 继承的 class。我已经注释掉了我必须尝试减少问题的另一个实体。

class StorageContext : DbContext
{
    public DbSet<UserDTO> Users { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("MySQLServerConnectionString")
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<UserDTO>().HasKey(entity => entity.Email);
        //modelBuilder.Entity<UserDTO>().HasMany(entity => entity.Roles);
    }
}

这里是 UserDTO class。当我尝试进行迁移时,任何人都可以看到导致错误的原因吗?

internal class UserDTO
{
    public EmailAddress Email { get; private set; }

    public string FullName { get; private set; }

    public string UserName { get; private set; }

    public virtual ICollection<string> Roles { get; private set; }

    // more below here like a constructor and some basic methods

如果我将 UserDTO 的密钥切换为纯字符串而不是复杂的对象 EmailAddress,它看起来会越过那个错误,我会得到一个不同的、同样有趣的错误:

The property 'Roles' on entity type 'Microsoft.SRE.NavisionOnline.ConfigurationAutomation.DAL.SQLEntities.UserDTO' has not been added to the model or ignored.

据我所知,您不能使用复杂类型作为 PK。

对于第二条错误信息: 您不能使用 ICollection<string> Roles {..},EF 不会将此 属性 映射到 table,因为您使用的是 "string" 作为类型。

您需要定义角色 class 并为其分配 PK

public class Role
{
     public int Id {get; set;}
     public string RoleName {get; set;}
}

然后在您的 UserDTO 中:

public ICollection<Role> Roles {...}