【发布时间】:2019-03-29 15:29:33
【问题描述】:
我认为下面示例中的模型有问题,但我不知道是什么问题。
在示例中,我有一个包含子项目的项目的容器类。一旦我尝试创建一个包含多个级别的项目的容器,它就会失去与容器的关系,因此由于外键约束而失败。
我得到的例外是:
Microsoft.EntityFrameworkCore.DbUpdateException :更新条目时出错。请参阅内部异常 细节。 ---- System.Data.SqlClient.SqlException : INSERT 语句与 FOREIGN KEY 约束冲突 “FK_Items_Containers_ContainerId”。数据库发生冲突 “测试”,表“dbo.Containers”,列“Id”。 该语句已终止。
当我查看 EF Core 使用 SQL Profiler 生成的 SQL 时,它会尝试为所有非直接子级的 Container 插入 0 作为 id。
因此,创建 Container 不是问题,第一级子级也不是问题,但是一旦我添加第二级,它就会失去与 Container 的关系。
public class Test
{
public class Container
{
[Required]
public int Id { get; set; }
public IEnumerable<Item> Items { get; set; }
}
public class Item
{
[Required]
public int Id { get; set; }
[Required]
public int ContainerId { get; set; }
public virtual Container Container { get; set; }
public int? ParentItemId { get; set; }
public virtual Item ParentItem { get; set; }
public IEnumerable<Item> ChildItems { get; set; }
}
public class TestContext : DbContext
{
public virtual DbSet<Container> Containers { get; set; }
public virtual DbSet<Item> Items { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Container>()
.HasMany(c => c.Items)
.WithOne(c => c.Container)
.HasForeignKey(c => c.ContainerId);
modelBuilder.Entity<Item>()
.HasOne(x => x.Container)
.WithMany(x => x.Items)
.HasForeignKey(x => x.ContainerId);
modelBuilder.Entity<Item>()
.HasOne(x => x.ParentItem)
.WithMany(x => x.ChildItems)
.HasForeignKey(x => x.ParentItemId);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseSqlServer(
@"Server=(localdb)\mssqllocaldb;Database=Test;Trusted_Connection=True;ConnectRetryCount=0");
}
public void ContextTest()
{
using (var context = new TestContext())
{
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
var container = new Container();
container.Items = new List<Item>
{
new Item
{
ChildItems = new List<Item>
{
new Item()
}
}
};
context.Containers.Add(container);
context.SaveChanges();
}
}
}
【问题讨论】:
标签: c# sql-server entity-framework-core