我试图了解如何更新一条记录并首次向该记录添加相关实体,然后使用新创建的相关外键更新原始记录记录。添加相关实体后更新实体的外键
例如,假设我有两个表:一个用于人员(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,
}
我需要更新勒布朗詹姆斯是勒布朗布朗,也加上他的地址。现在我搜索记录,并执行以下操作,它更新的人员记录,并创建一个地址记录:
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();
任何帮助,将不胜感激。谢谢
LINK TO CROSSPOST
我结束了crossposting到的EntityFramework核心Github上,因为我开始认为这可能是一个错误,因为它不产生在子实体的外键自动喜欢它应该。 GitHub上的问题附有示例项目(稍微比这里显示的示例更复杂),如果您想要查看它,请复制错误:https://github.com/aspnet/EntityFramework/issues/5833
具有数据注释或EntityTypeConfigurations的类声明将有所帮助,但基本上不会手动更新FK,因为在SaveChanges调用之前,它们都采用默认值(default(int)== 0 '),这就是为什么有一个例外。 –
好吧,这是我的问题更多样本..但它是相当接近我的实际表。我按要求添加了类声明。 – chris
在你的例子中,通过设置'person.tbl_Address',EF将插入地址并自行更新'Person'。 –