我試圖瞭解如何更新一條記錄並首次向該記錄添加相關實體,然後使用新創建的相關外鍵更新原始記錄記錄。添加相關實體後更新實體的外鍵
例如,假設我有兩個表:一個用於人員(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'。 –