我有一個問題,我只是無法通過谷歌解決或在stackoverflow上搜索。EF HasOptional WithMany
我有兩張表JournalLines和帳戶,我想引用一個帳戶在一個journalline(我討厭經濟學),但參考必須是可選的,帳戶有任何導航屬性到JournalLine(理想情況下)。
JournalLine:
public class JournalLine : Entity<int>
{
public int? Account_Id { get; set; }
public string Desc { get; set; }
public decimal Credit { get; set; }
public decimal Debit { get; set; }
public virtual Account Account { get; set; }
}
_account:
public class Account : Entity<int>
{
public string Accid { get; set; }
public string Desc { get; set; }
public int VatcodeId { get; set; }
}
和相應的映射:
public class JournalLineMap : EntityTypeConfiguration<JournalLine>
{
public JournalLineMap()
{
HasKey(k => new { k.Id, k.Account_Id });
Property(k => k.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
ToTable("attJournalLines");
HasEntitySetName("JournalLines");
HasOptional(jl => jl.Account)
.WithMany()
.HasForeignKey(jl => jl.Account_Id);
}
}
public class AccountMap : EntityTypeConfiguration<Account>
{
public AccountMap()
{
ToTable("attAccounts");
HasEntitySetName("Accounts");
}
}
錯誤IM得到的是這樣的:
tSystem.Data.Entity.Edm.EdmAssociationType:模型生成過程中檢測到
一個或多個驗證錯誤:在關係的參考>約束在角色「JournalLine_Account_Target」多重衝突'JournalLine_Account'。 >因爲從屬角色中的所有屬性都是不可空的,所以>主體角色的多重性必須爲'1'。
這使我困惑,我希望有人能夠解決這個問題。
更新
感謝您的答案它幫助我在路上和我有關係通過刪除鍵工作。然後,我在將Account
分配給JournalLine
時創建了一個奇怪的行爲,創建了重複帳戶。事實證明,這不是這樣奇怪的行爲,因爲我使用依賴注入的Repository模式。我沒有想到的是,這兩個存儲庫中的上下文並不相同,所以JournalLinesRepository不會跟蹤我從自己的存儲庫中獲取的帳戶,因此認爲只需將其作爲新實體插入即可。這是通過在存儲庫中注入相同的上下文來解決的,以便項目跟蹤按預期工作。再次感謝您的幫助。
什麼是實體?也許我已經過時了EF - 它是框架的一部分,還是它是一個自定義的基類,其中是Id屬性? –
STW
這是正確的,它只是一個自定義的基類,它指定了Id列的類型。在某些情況下有點多餘,但在其他 – Patrik