c# - 分离时删除 Entity Framework Core 中的一比零或一相关数据 (sqlite)

标签 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 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/

相关文章:

C#问答游戏: What to do in case of a tie?

asp.net - Blazor ASP.Net Core 3.1 Web API 发布时返回 404 错误

.net - 缺少 Entity Framework Include(lambda) 扩展

linq - 动态地将类型传递给方法<T>

iphone - 以编程方式将 SQLite 数据导出到 iOS 中的 Excel

android - 我们如何知道我们的应用程序数据何时在 android 中被清除?

c# - 非贪婪正则表达式开头但不包含字符串

c# - 使用 Web 服务时类型不兼容

c# - EasynetQ 总线。订阅未触发 - 抛出 "messageType must not be null"

database - 如何更改 SQLite 数据库中列中的值?