簡體   English   中英

兩種自我參照的一對多關系

[英]Two self-referencing one to many relations

這是我的第一個問題,因此,如果有格式問題或措辭不清楚,請不要猶豫告訴我。

我有一個名為Item的實體,除其他屬性外,該實體還具有指向同一DBSet中其他項目(“ GlobalItem”和“ DepositItem”)的兩個鏈​​接。

public class Item
{
    public int ItemID { get; private set; }

    public virtual Item GlobalItem { get; set; }

    public virtual Item DepositItem { get; set; }

    protected Item() { }
}

映射是這樣完成的:

 public ItemMap()
    {
        HasKey(o => o.ItemID);

        ToTable("Item", "dbo");

        // Relationships
        HasOptional(o => o.GlobalItem)
            .WithMany()
            .Map(m => m.MapKey("GlobalItemID"));

        HasOptional(o => o.DepositItem)
            .WithMany()
            .Map(m => m.MapKey("DepositItemID"));
    }

構建過程是成功的,但是當我嘗試使用GetAll()時,將引發以下異常:

System.Data.Entity.Core.EntityCommandExecutionException:'執行命令定義時發生錯誤。 有關詳細信息,請參見內部異常。

內部異常:

SqlException:無效的列名稱'DepositItem_ItemID'。

無效的列名“ DepositItem_ItemID”。

無效的列名“ DepositItem_ItemID”。

我知道此異常通常是由簡單的映射錯誤引起的,但是在這種情況下,我很困惑,因為我確保ColumnName和MapKey是正確的,並且所有常規的解決方法都像在實體中顯式定義DepositItemID並使用.HasForeignKey(k = k.DepositItemID)而不是以前的映射定義沒有任何改變。

EF6是否存在多個自引用虛擬屬性的普遍問題? 有人可以向我解釋,為什么對於DepositItem忽略映射鍵,而對於GlobalItem忽略映射鍵? 有人可以發現我的設計中的缺陷嗎?

最好的問候,並感謝您的努力,

我建議你的對象應該是

public class Item
{
    public int ItemID { get; private set; }

    public int? GlobalItemID { get; set; }

    public int? DepositItemID { get; set; }

    [ForeignKey("GlobalItemID")]
    public Item GlobalItem { get; set; }

    [ForeignKey("DepositItemID")]
    public Item DepositItem { get; set; }

    protected Item() { }
}

該模型沒有錯。 也許您的數據庫需要重新創建。

看到:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Data.SqlClient;
using System.Linq;

namespace Ef6Test
{
    public class Item
    {
        public int ItemID { get; private set; }

        //public virtual Category Category { get; set; }

        public string Description { get; set; }

        public string ItemLookupCode { get; private set; }

        public virtual Item GlobalItem { get; set; }

        public virtual Item DepositItem { get; set; }

        public bool IsDeleted { get; set; }

        //public virtual ItemExtension ItemExtension { get; set; }



        public Item() { }
    }
    class Db : DbContext
    {

       public DbSet<Item> Items { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<Item>().HasKey(o => o.ItemID);

            modelBuilder.Entity<Item>().ToTable("Item", "dbo");

            // Relationships
            //HasRequired(t => t.Category)
            //    .WithMany(o => o.Items)
            //    .Map(m => m.MapKey("CategoryID"));

            modelBuilder.Entity<Item>().HasOptional(o => o.GlobalItem)
                .WithMany()
                .Map(m => m.MapKey("GlobalItemID"));

            modelBuilder.Entity<Item>().HasOptional(o => o.DepositItem)
                .WithMany()
                .Map(m => m.MapKey("DepositItemID"));

            //HasOptional(o => o.ItemExtension)
            //    .WithRequired(o => o.Item);



        }



        class Program
        {


            static void Main(string[] args)
            {

                Database.SetInitializer(new DropCreateDatabaseAlways<Db>());


                using (var db = new Db())
                {
                    db.Database.Log = m => Console.WriteLine(m);
                    db.Database.Initialize(true);

                    var items = db.Items.ToList();


                }


                Console.WriteLine("Hit any key to exit");
                Console.ReadKey();
            }
        }
    }
}

創造

CREATE TABLE [dbo].[Item] (
    [ItemID] [int] NOT NULL IDENTITY,
    [Description] [nvarchar](max),
    [ItemLookupCode] [nvarchar](max),
    [IsDeleted] [bit] NOT NULL,
    [DepositItemID] [int],
    [GlobalItemID] [int],
    CONSTRAINT [PK_dbo.Item] PRIMARY KEY ([ItemID])
)

Item模型和映射很好。

此問題是由另一個未在數據庫中映射的實體中的舊導航屬性(也稱為“ DepositItem”)引起的。

暫無
暫無

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

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