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 {...}
我正在尝试使用 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 {...}