Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分离时删除实体框架核心中的一对零或一个相关数据(sqlite)_C#_Entity Framework_Sqlite_Entity Framework Core - Fatal编程技术网

C# 分离时删除实体框架核心中的一对零或一个相关数据(sqlite)

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

我正在使用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);
    }
}
我希望最终结果是表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();
    }
}