这是我的第一个问题,因此,如果存在格式问题或措辞不清楚,请不要犹豫告诉我。
我有一个名为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忽略映射键?有人可以发现我的设计中的缺陷吗?
最诚挚的问候,感谢您的努力,
答案 0 :(得分:0)
我建议您的对象应该是
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() { }
}
答案 1 :(得分:0)
该模型没有错。也许您的数据库需要重新创建。
请参阅:
idcter = (idcter+1) % (maxid+1) # 9997 -> 9998 -> 9999 -> 0 -> 1
创建
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();
}
}
}
}
答案 2 :(得分:0)
Item模型和映射很好。
此问题是由另一个未在数据库中映射的实体中的旧导航属性(也称为“ DepositItem”)引起的。