我正在使用 Entity Framework Core 1.1.0,并且我有两个实体:
class One
{
public int Id { get; set; }
public string Text { get; set; }
public ZeroOrOne Property { get; set; }
}
class ZeroOrOne
{
public int Id { get; set; }
}
以下上下文配置如下:
class TestContext : DbContext
{
public DbSet<One> Ones { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite("Filename=local.db");
base.OnConfiguring(optionsBuilder);
}
}
我确认了 One 和 ZeroOrOne 之间的关系确实是我所认为的一对零或一:
migrationBuilder.CreateTable(
name: "Ones",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
PropertyId = table.Column<int>(nullable: true),
Text = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Ones", x => x.Id);
table.ForeignKey(
name: "FK_Ones_ZeroOrOne_PropertyId",
column: x => x.PropertyId,
principalTable: "ZeroOrOne",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
如果我运行以下程序...
class Program
{
static void Main(string[] args)
{
var one = new One { Property = new ZeroOrOne(), Text = "Adding related"};
using (var context = new TestContext())
{
context.Database.Migrate();
context.Ones.Add(one);
context.SaveChanges();
}
one.Text = null;
one.Property = null;
using (var context = new TestContext())
{
context.Ones.Update(one);
context.SaveChanges();
}
}
}
我预计最终结果是表 One 的 Text 和 Property 列均包含 null。对于“文本”来说是这样,但对于“属性”列则不然。
我的问题是,这是一个错误还是不跟踪实体的缺点之一?鉴于实体必须在不被任何上下文跟踪的情况下进行更改,我将如何解决这个问题?
我是否必须再次查询 One 并手动取消第二个上下文实例?
最佳答案
我不能说这是否是一个错误或缺点(在当前的 EF Core 状态下,人们永远不知道某些东西是否有效、为什么以及该行为是否会在未来版本中改变)。
看起来导航和阴影属性没有被 Update
调用标记为已修改。因此,当前的解决方法可能是手动执行此操作:
context.Ones.Update(one);
context.Entry(one).Reference(e => e.Property).IsModified = true;
context.SaveChanges();
关于c# - 分离时删除 Entity Framework Core 中的一比零或一相关数据 (sqlite),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41576943/