C# 分离时删除实体框架核心中的一对零或一个相关数据(sqlite)
我正在使用Entity Framework Core 1.1.0,我得到了两个实体:C# 分离时删除实体框架核心中的一对零或一个相关数据(sqlite),c#,entity-framework,sqlite,entity-framework-core,C#,Entity Framework,Sqlite,Entity Framework Core,我正在使用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 TestCont
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);
}
}
我希望最终结果是表1,其中文本列和属性列都包含null。这适用于文本,但不适用于属性列
我的问题是,这是一个bug还是不跟踪实体的缺点之一?如果实体必须在不被任何上下文跟踪的情况下进行更改,我将如何解决这个问题
我是否需要再次查询一个,然后手动取消第二个上下文实例的值?我不能说这是一个bug还是一个缺点(在当前的EF核心状态下,人们永远不知道某个东西是否工作,为什么以及在将来的某个版本中行为是否会改变) 看起来导航和阴影属性没有被
Update
调用标记为已修改。因此,当前的解决方法可能是手动执行:
context.Ones.Update(one);
context.Entry(one).Reference(e => e.Property).IsModified = true;
context.SaveChanges();
我已经在EF core github上提交了申请,该申请很快被关闭。然后,我在ajcvickers的帮助下,根据我目前对事物的理解,找到了一个我认为是最佳解决方案的解决方案:
将显式外键添加到One
POCO类:
公共int?ZeroOrOneId{get;set;}
我还重命名了属性,以减少混淆:
public ZeroOrOne ZeroOrOne{get;set;}
将导航属性设置为null
时,还要将显式外键设置为null
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.ZeroOrOne = null;
one.ZeroOrOneId = null;
using (var context = new TestContext())
{
context.Ones.Update(one);
context.SaveChanges();
}
}
现在更新工作如我所料。这就成功了。我想我会尝试在他们的github页面上提交一个bug。
context.Ones.Update(one);
context.Entry(one).Reference(e => e.Property).IsModified = true;
context.SaveChanges();
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.ZeroOrOne = null;
one.ZeroOrOneId = null;
using (var context = new TestContext())
{
context.Ones.Update(one);
context.SaveChanges();
}
}