我不能讓我的頭一輪這一點,所有的線程在SO狀態我做了所有正確的事情,但顯然我必須錯過了一些東西......EF 0..1一對多的關係更新
鑑於這兩個對象DEFS ...
public class Invoice
{
[Key]
public int Id { get; set; }
[ForeignKey("Block")]
public int? BlockingCodeId { get; set; }
public virtual BlockingCode Block { get; set; }
...
}
public class BlockingCode
{
[Key]
public int Id { get; set; }
public virtual ICollection<Invoice> Invoices { get; set; }
...
}
然後用適當的關係配置上下文...
public class FaureciaContext : EFDataContext
{
public virtual DbSet<Invoice> Invoices { get; set; }
public virtual DbSet<BlockingCode> BlockingCodes { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Invoice>()
.HasOptional(e => e.Block)
.WithMany(e => e.Invoices);
}
}
爲什麼,當我做到這一點...
// assume this invoice has a BlockingCode relationship
var invoice = db.Invoices.First();
invoice.BlockingCodeId = null;
db.Savechanges();
我能得到這個例外...
操作失敗:關係不能被改變,因爲 一個或多個外鍵的屬性是不可爲空。當 更改爲關係時,相關的外鍵屬性 設置爲空值。如果外鍵不支持空值,則必須定義一個新的關係,外鍵屬性必須爲 分配另一個非空值,或者無關對象必須爲 刪除。
編輯:
我以爲我會補充說,像是這裏的答案並沒有真正指出了真正的答案我有問題...
原來,在參考問題是,不是我,其實是更新發票類的其他子類屬性的進一步增長像這樣的代碼問題....
invoice.Lines = MergLines(newVersion, dbVersion);
我的合併代碼工作正常,但任何敏銳的EF用戶會知道ÿ你不能簡單地「像這樣替換一個孩子集合」,你必須刪除舊的並根據需要添加新的。
如果你所做的'modelBuilder.Entity()的hasMany(E。 => e.Invoices).WithOptional(e => e.Block).HasForeignKey(e => e.BlockingCodeId)''。至少這就是我在數據庫第一版中設置類似關係的方式。 SideNote:這就是爲什麼我從不先做代碼。我更喜歡設置數據庫,然後讓EF來計算這些東西。 –
juharr
nope ...雖然很好,但:( – War
我懷疑數據庫中的Invoice.BlockingCodeId是一個不爲空的外鍵約束 – shadow