c# - 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 中的错误?
解决方案
如果您使用 EF Code First(至少您使用 Fluent api),您可以先将如下所示的属性添加到您的主键中:
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
您在此处使用对象初始化程序,但未将 Id 设置为特定的 Guid 值。例如,它们可能会以 Guid.Empty 值发送到数据库。
EF支持为添加到数据库的场景保存对象图,你可以研究这个例子。请注意,这里的 id 是整数,而不是 Guid。
所以首先我会尝试将 DatabaseGenerated 选项添加到您的 id,也可以使用 Fluent API 进行设置。
推荐阅读
- python - Python 3 登录网站并下载文件
- javascript - Show checkbox dynamically
- java - 将Java Spring应用程序部署到heroku时时区指示器''无效
- hibernate - 从文件上传中获取错误
- c++ - Can someone please explain the results returned by 'sizeof' in this code
- python - 用append方法构建DataFrame类型的类,不能改变类的实例
- java - 如何使用函数变量的值更新实例变量?
- security - 使用 OpenSSL 自签名证书时,知道输入数据是否有助于攻击加密?
- reactive-programming - Sorted order in Flux of custom class
- javascript - How to filter raw element value javascript?