在我的ASP.NET Core 1.0,MVC6,EF7 Web应用程序中,我添加了一个添加新相关表(及相应模型)的迁移。我有以下模型快照:
[DbContext(typeof(ApplicationDbContext))]
partial class ApplicationDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
modelBuilder
.HasAnnotation("ProductVersion", "7.0.0-rc1-16348")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("Salesboost.Models.ApplicationUser", b =>
{
b.Property<string>("Id");
b.Property<int?>("TeamId");
b.HasKey("Id");
// -- <unrelated fields snipped> --
});
// -- <snipped> --
modelBuilder.Entity("Team", b =>
{
b.Property<int>("Id").ValueGeneratedOnAdd();
b.Property<string>("Name").IsRequired();
b.Property<string>("ManagerId").IsRequired();
b.HasKey("Id");
});
modelBuilder.Entity("Team", b =>
{
b.HasOne("ApplicationUser", "Manager")
.WithOne("TeamManaging")
.HasForeignKey("ManagerId");
});
}
}
Team.cs:
public class Team
{
public int Id { get; set; }
public string Name { get; set; }
public string ManagerId { get; set; }
public virtual ApplicationUser Manager { get; set; }
public virtual ICollection<ApplicationUser> Members { get; set; }
}
ApplicationUser:
public class ApplicationUser : Microsoft.AspNet.Identity.EntityFramework.IdentityUser
{
public int? TeamId { get; set; }
public virtual Team Team { get; set; }
public virtual Team TeamManaging { get; set; }
}
当我尝试更新数据库时,dnx给出了以下错误:
导航属性&#39;经理&#39;无法添加到实体类型&#39;团队&#39;因为实体类型是以阴影状态定义的,导航属性无法添加到阴影状态。
实体类型处于&#34;阴影状态&#34;是什么意思?有办法解决这个问题吗?
答案 0 :(得分:1)
EF documentation解释了影子属性是什么:
您可以使用Fluent API配置阴影属性。一旦调用属性 - A.C.的字符串重载,就可以链接任何其他属性的配置调用。
如果提供给Property方法(
Property<...>("...")
- AC)的名称与现有属性的名称 - AC(阴影属性或实体类中定义的属性)匹配,则代码将配置现有属性,而不是引入新的shadow属性。
所以,当实体具有至少一个阴影属性 时,我猜一个实体处于阴影状态。
这意味着在使用Property<...>("...")
的字符串重载时应该非常小心,因为这可能会引入阴影属性,即使您不需要它们也是如此。因此,当需要创建数据库时,EF会抱怨阴影状态的实体不存在CLR类型。
使用nameof()
代替普通字符串可能有所帮助。因此,重载看起来像Property<...>(nameof(...))
更安全。
最后,为了更接近点影子属性,引入了处理实体之间的关系。 以下解释:
按照惯例,只有在发现关系但在依赖实体类中找不到外键属性时才会创建阴影属性。在这种情况下,将引入影子外键属性。
答案 1 :(得分:0)
这个问题实际上与我的ApplicationDbContext
课有关。我已添加到ApplicationDbContextModelSnapshot
:
ApplicationDbContext
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
// -- <snipped> --
public DbSet<Team> Teams { get; set; }
public ApplicationUser Manager { get; set; }
public ApplicationUser Members { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Team>().HasOne(typeof(ApplicationUser), "Manager")
.WithOne("TeamManaging")
.HasForeignKey(typeof(Team), "ManagerId")
.HasPrincipalKey(typeof(ApplicationUser), "Id");
builder.Entity<ApplicationUser>().HasOne(typeof(Team), "Team")
.WithMany("Members")
.HasForeignKey("TeamId");
}
}
然后我学习了如何使用dnx ef migrations add [migration name]
生成迁移。
通过这种方式,我成功地使我的网站正常运行,但我仍然想知道“影子状态”是什么,如果有人可以回答。
答案 2 :(得分:-1)
您是否阅读过https://github.com/aspnet/EntityFramework/issues/2801? 您正在使用不稳定版本的Entity Framework,尝试重新创建数据库。 如果您的应用程序要进入生产环境,您应该考虑转移到EF 6.x.