我正在使用 .Net6 核心,采用 EF 代碼優先方法。
我有像這樣的課程
class Foo {
[Required]
private Bar Bar {get; set;};
...
}
class Bar {
[Required]
private BarChild BarChild {get; set;};
...
}
class BarChild {
...
}
現在我想Foo在資料庫中插入一個實體,如下所示:
Context.Comments.Add(foo);
Context.SaveChanges();
現在這給了我錯誤'唯一約束失敗......'因為Foo有一個導航屬性Bar但Bar已經存在于資料庫中。
我找到了解決方案:
Context.Entry(foo.Bar).State = EntityState.Unchanged;
Context.Entry(foo.Bar.BarChild).State = EntityState.Unchanged;
請注意,BarChild即使我已經為Bar.
問題是一些類有相當多的導航屬性,而它們又具有導航屬性,因此我的問題是,有沒有更好的方法來“忽略”這些導航屬性?
我不能只將它們設定為,null因為在資料庫中有一個參考這些導航屬性的外鍵。
uj5u.com熱心網友回復:
對于不涉及欺騙更改跟蹤器認為它已經看到實際上是一個新 Bar 的其他選項,如果您在 Foo 中有 Bar 的 ID 屬性,您可以設定它,EF 將撰寫一個與現有的 Bar 也無需嘗試撰寫 Bar
class Foo {
int BarId {get; set;}
Bar Bar {get; set;};
...
}
如果您知道資料庫包含 Bar 3,并且您希望您的新 Foo's Bar 成為那個 Bar,您可以:
db.Foos.Add(new Foo { BarId = 3, ... });
db.Save...
您還可以下載現有的 Bar:
var f = new Foo { Bar = db.Bars.Find(3) };
db.Foos.Add(f);
db.Save...
..這可能不太受歡迎,因為它有點浪費資源,除非您也需要檢索 Bar 來對其執行其他操作
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/448779.html
