簡體   English   中英

'當附加現有實體時,確保只有一個實體實例具有給定鍵'添加到導航屬性列表 EF Core

[英]'When attaching existing entities, ensure that only one entity instance with a given key' when adding to list of navigation properties EF Core

我正在使用 EF Core 3.1.23 w .NET Core 3.1

解釋:

我在數據庫中存儲有關 xml 文件的信息。

Xml 文件以以下格式存儲:

<section name="NAME">
        <key name="NAME" value="0" />
        ...
</section>

xml 文件有大約 40 個部分,每個部分有 1 - 20 個字段(鍵)

  • 每個部分都有很多鍵
  • 每個鍵有 1 個部分

對應的數據庫類:

    public class XmlKey
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        public string Name { get; set; }

        public virtual XmlSection XmlSection { get; set; }
        public int? XmlSectionId { get; set; }
    }

    public class XmlSection
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        public string Name { get; set; }

        public List<XmlKey> Keys { get; set; }
    }

    public class XmlMapping
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        public virtual XmlKey XmlKey { get; set; }
        public int? XmlKeyId { get; set; }

        public int Value { get; set; }
    }

  • 每個映射都是一個鍵和一個值
  • 每個配置都有許多映射

執行代碼:

    using (DatabaseContext dbContext = new DatabaseContext())
            {
                //add new mappings that are not in the database
                dbContext.AddRange(XmlMappings);


                //create new configuration and add to list of nav props
                var config = new XmlConfiguration()
                {
                    Name = Name,
                    Mappings = XmlMappings.ToList()
                };

                //Attach vs Add? Have tried both here in every location with same result
                dbContext.XmlConfigurations.Attach(config);
                dbContext.SaveChanges();
            }

嘗試創建新配置並向該配置添加新映射時,如果 2 個映射鍵具有相同的部分,則會產生以下錯誤

'無法跟蹤實體類型'XmlSection'的實例,因為已經在跟蹤另一個具有鍵值'{Id:12}'的實例。 附加現有實體時,請確保僅附加一個具有給定鍵值的實體實例。

(理論)流程為 go:

  1. 通過選擇鍵和值在 UI 中創建新的 xml 映射(所有鍵具有相同的部分)
  2. 創建包含映射列表的新配置
  3. 既然我們知道我們肯定會保存此配置,請保存映射
  4. 保存配置,添加映射到配置

但是,這會導致上述錯誤。

如何避免這種行為? 我嘗試附加、分離、加載導航道具 AsNoTracking();,添加導航道具而不是顯式設置列表,更改了數據庫上下文選項。

您創建一個新的 DatabaseContext()。 XmlMappings 中是否只有新元素。 如果您在 XmlMappings 中跟蹤了元素,則必須使用您從中加載實例的相同 DatabaseContext 來保存它們。 為了更好地分析,請顯示 XmlMappings 創建

暫無
暫無

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

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