【发布时间】:2016-06-22 22:15:31
【问题描述】:
我正在尝试了解如何第一次更新一条记录并将相关实体添加到该记录,然后使用新创建的相关记录中的外键更新原始记录。
例如,假设我有两张表:一张用于人员 (tbl_person),另一张用于地址 (tbl_address)。
+----+------------+-----------+-----------+
| PK | First Name | Last Name | AddressFK |
+----+------------+-----------+-----------+
| 1 | Michael | Jordan | 1 |
| 2 | Lebron | James | |
+----+------------+-----------+-----------+
public int PersonID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int? AddressID { get; set; }
public virtual tbl_Address tbl_Address { get; set; }
entityBuilder
.HasOne(t => t.tbl_Address)
.WithOne(t => t.tbl_Person)
.HasForeignKey<tbl_Person>(d => d.AddressID)
.IsRequired(false);
+----+-------------------+----------+-------+
| PK | Address Line 1 | City | State |
+----+-------------------+----------+-------+
| 1 | 123 Sesame Street | New York | NY |
+----+-------------------+----------+-------+
public int AddressID { get; set; }
public string AddressLine1 { get; set; }
public string City { get; set; }
public string State { get; set; }
public virtual tbl_Person tbl_Person { get; set; }
我的应用收到以下需要更新的 JSON 记录。
{
"address": {
"addressLine1": "789 Hollywood Ave",
"city": "Hollywood",
"state": "CA"
},
"firstname": "Lebron",
"lastname": "Brown",
"id": 2,
}
我需要将 Lebron James 更新为 Lebron Brown,并添加他的地址。现在我搜索记录并执行以下操作,它会更新 Person 记录并创建一个地址记录:
var person = _db.tbl_Person
.Include(t => t.tbl_address)
.Where(t => t.Id == json.id).First();
person.firstname = json.firstname;
person.lastname = json.lastname;
if(person.tbl_Address == null)
{
person.tbl_Address = new tbl_Address() {
AddressLine1 = json.address.addressLine1,
City = json.address.city,
State = json.address.state,
};
}
db.SaveChanges();
问题是当我尝试在保存更改之前使人员 addressID 等于新创建的 addressID 时,它会给我一个关于外键约束的错误。
person.AddressID = person.tbl_Address.Id;
db.SaveChanges();
任何帮助将不胜感激。谢谢
交叉发布链接
我最终交叉发布到 EntityFramework Core Github,因为我开始认为这可能是一个错误,因为它没有像预期的那样在子实体中自动生成外键。 GitHub 上的问题附有示例项目(比此处显示的示例稍微复杂一些),如果您想检查它,则会复制错误:https://github.com/aspnet/EntityFramework/issues/5833
【问题讨论】:
-
带有数据注释或 EntityTypeConfigurations 的类声明会有所帮助,但基本上您不会手动更新 FK,因为当时(在 SaveChanges 调用之前)它们都采用默认值(
default(int) == 0) 这就是为什么会有例外。 -
嗯,这更像是我的问题的一个示例。但它与我的实际表格相当接近。我按要求添加了类声明。
-
在您的示例中,通过设置
person.tbl_Address,EF 将插入地址并自行更新Person。
标签: entity-framework entity-framework-core