簡體   English   中英

EF:沒有為屬性指定映射

[英]EF : no mapping specified for properties

我有兩張表MeetingPollingQuestionMeetingPollingParts 會議投票問題 pk MeetingPollingQuestionIdmeeting polling parts的外鍵。 我想插入MeetingPollingQuestion然后使用 PK 將行插入到MeetingPollingParts中。 我收到有關“沒有為屬性指定映射”的錯誤消息,我不確定這意味着什么。

在此處輸入圖像描述

我的代碼:

   mf.MeetingPollingId = mpq.MeetingPollingId;
   mf.MeetingPollingQuestionType = mpq.MeetingPollingQuestionType;
   mf.SequenceOrder = mpq.SequenceOrder;
    
   db.MeetingPollingQuestions.Add(mf);
    
   var MeetingPollingPartList = new List<EFModel.MeetingPollingPart>();
    
   foreach (var p in mpq.MeetingPollingParts)
   {
       var mfParts = new EFModel.MeetingPollingPart();
       mfParts.MeetingPollingQuestionId = mf.MeetingPollingQuestionId;
       mfParts.Type = p.Type;
       MeetingPollingPartList.Add(mfParts);
   }

   db.MeetingPollingParts.AddRange(MeetingPollingPartList);
    
   db.SaveChanges();
   dbTran.Commit();

這是我得到的錯誤:

從第 4481 行開始映射片段時出現問題:沒有為 Set MeetingPollingParts 中的屬性 MeetingPollingPart.MeetingPollingQuestionMeetingPollingQuestionId、MeetingPollingPart.MeetingPollingQuestionMeetingPollingQuestionId1 指定映射。
具有密鑰(PK)的實體不會往返

使用導航屬性插入相關實體。

您的方法的問題是,當 EF 設置為使用標識列時,您將沒有 PK 可用作 FK,直到您在 DbContext 上調用SaveChanges 如果您使用跟蹤導航屬性,則 EF 將自動確保以正確的順序插入實體並將 FK 關聯到新插入的父記錄。

例如,MeetingPolling 應該有一個 MeetingPollingQuestions 的集合,而一個 MeetingPollingQuestion 應該有一個 MeetingPollingParts 的集合。

IE

public class MeetingPolling
{
    // ID, and various fields...

    public virtual ICollection<MeetingPollingQuestion> MeetingPollingQuestions { get; protected set; } = new List<MeetingPollingQuestion>();
}

public class MeetingPollingQuestion
{
    // ID, and various fields....

    public virtual ICollection<MeetingPollingPart> MeetingPollingParts { get; protected set; } = new List<MeetingPollingPart>();
}

更新現有 MeetingPolling 以添加/更新問題和部分時的下一個重要細節是確保這些 collections 已預先加載,以便可以對其進行修改:

var meetingPolling = db.MeetingPollings
    .Include(x => x.MeetingPollingQuestions)
        .ThenInclude(x => x.MeetingPollingParts)
    .Single(x => x.Id == meetingPollingId);

現在,當您 go 創建您的問題時,您填充一個新的 MeetingPollingQuestion 並像現在一樣填寫詳細信息,除了將其添加到 DbContext 之外,您將其添加到您已加載的 MeetingPolling 的問題集合中:

meetingPolling.MeetingPollingQuestions.Add(newMeetingPollingQuestion);

填充 MeetingPollingParts 也是如此。 創建一個填充詳細信息的新實體,但 append 是新的 MeetingPollingQuestion。

最終結果看起來更像這樣:

var meetingPolling = db.MeetingPollings
    .Include(x => x.MeetingPollingQuestions)
        .ThenInclude(x => x.MeetingPollingParts)
    .Single(x => x.Id == meetingPollingId);

var newMeetingPollingQuestion = new MeetingPollingQuestion
{
    MeetingPollingQuestionType = mpq.MeetingPollingQuestionType,
    SequenceOrder = mpq.SequenceOrder,
    // ...
    MeetingPollingParts = mpq.MeetingPollingParts.Select(p => new MeetingPollingPart
    {
        Type = p.Type,
        // ...
    }).ToList()
};

meetingPolling.MeetingPollingQuestions.Add(newMeetingPollingQuestion);
db.SaveChanges();

EF 將自動處理新記錄的所有 FK 分配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM