thm*_*spl 4 c# entity-framework entity-framework-core
我试图简单地使用 EF core 3 为两个表添加种子,但它不起作用。这是一个很小的操作,但 EF 似乎无法做到这一点。
对象模型
public class Object
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
[ForeignKey("Building")]
public int BuildingId { get; set; }
public Building Building { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
建筑模型
public class Building
{
[Key]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public virtual List<Object> Objects { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
上下文类
public class AppDatabaseContext : DbContext
{
private static readonly DbContextOptions options = new DbContextOptionsBuilder<AppDatabaseContext>().UseInMemoryDatabase("INMEM-DB").EnableSensitiveDataLogging().Options;
public AppDatabaseContext() : base(options)
{
}
public DbSet<Building> Buildings { get; set; }
public DbSet<Object> Objects { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Object>().HasOne(i => i.Building).WithMany(b => b.Objects);
modelBuilder.Entity<Building>().HasMany(b => b.Objects).WithOne(i => i.Building);*/
Building testBuilding = new Building()
{
Id = 1,
Name = "Test Building"
};
modelBuilder.Entity<Building>(b =>
{
b.HasData(testBuilding);
});
modelBuilder.Entity<Object>(o =>
{
o.HasData(new Object()
{
Id = 1,
Name = "Test Object",
Building = testBuilding,
});
});
}
}
Run Code Online (Sandbox Code Playgroud)
错误信息
System.InvalidOperationException:“无法添加键值为“Id:1”的实体类型“Object”的种子实体,因为它设置了导航“Building”。要种子关系,您需要将相关实体种子添加到“Building”并指定外键值 {'BuildingId'}。
为什么它不起作用?请帮我。我打算扔掉这整个废话并用 Java 重写它(这会快得多)。
正如错误所示:“要建立关系种子,您需要将相关实体种子添加到‘建筑物’并指定外键值”
在 EF 中,您同时拥有“外键属性”和“导航属性”。对于大多数操作,您可以使用其中之一,但EF Core 数据播种要求您直接设置外键属性。
modelBuilder.Entity<Object>(o =>
{
o.HasData(new Object()
{
Id = 1,
Name = "Test Object",
//Building = testBuilding,
BuildingId = 1
});
});
Run Code Online (Sandbox Code Playgroud)