[英]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.