首页 > 解决方案 > EF 按错误顺序保存实例

问题描述

我有以下示例类:

public class A {
    public Guid Id { get; set; }
    public B B { get; set; }
}

public class B {
    public Guid Id { get; set; }
    public string SomeProperty { get; set; }
}

public class AConfiguration : EntityTypeConfiguration<A> {
    public AConfigurations() {
         HasOptional(x=> x.B)
             .WithRequired();
    }
}

当我添加 A 和 B 的新实例时,如下所示:

var a = new A() {
    B = new B() {
        SomeProperty = "Some Value"
    }
};
context.As.Add(a);
context.SaveChanges();

考虑到该模型,迁移为 A 创建了一个带有 Guid PK 的表,并为 B 创建了一个表。B 将其 PK 标记为 A 的 FK,这符合我的需要。

问题是:当它点击 SaveChanges 时,EF 在插入 A 之前尝试插入 B,这会在数据库上创建 FK 异常。

我是否遗漏了什么或者这是 EF 6 中的错误?

标签: c#entity-frameworkentity-framework-6

解决方案


如果您使用 EF Code First(至少您使用 Fluent api),您可以先将如下所示的属性添加到您的主键中:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }

您在此处使用对象初始化程序,但未将 Id 设置为特定的 Guid 值。例如,它们可能会以 Guid.Empty 值发送​​到数据库。

EF支持为添加到数据库的场景保存对象图,你可以研究这个例子。请注意,这里的 id 是整数,而不是 Guid。

代码示例 EF 保存相关数据

所以首先我会尝试将 DatabaseGenerated 选项添加到您的 id,也可以使用 Fluent API 进行设置。


推荐阅读