当我尝试为我的代码第一个上下文创建迁移时,我收到此错误:
错误:未加载“Exiled_Trader.Models.TradeContexts.Item_AdditionalProperties”关系,因为“Exiled_Trader.Models.TradeContexts.Property”类型不可用。
我的项目模型与属性表有多个多对多的关系,这些关系在少数不同的属性中使用。在这里看起来如何:
public class Item
{
public Item()
{
AdditionalProperties = new List<Property>();
NextLevelRequirements = new List<Property>();
Properties = new List<Property>();
Requirements = new List<Property>();
}
public int ItemId { get; set; }
public List<Property> AdditionalProperties { get; set; }
public List<Property> NextLevelRequirements { get; set; }
public List<Property> Properties { get; set; }
public List<Property> Requirements { get; set; }
}
这是属性模型:
public class Property
{
public Property()
{
Values = new List<PropertyValue>();
}
public int PropertyId { get; set; }
public int ItemId { get; set; }
public Item Item { get; set; }
public List<PropertyValue> Values { get; set; }
public string Name { get; set; }
public int? DisplayMode { get; set; }
public int? Type { get; set; }
public int? Progress { get; set; }
}
这是Item流畅的api配置:
HasKey(i => i.ItemId);
HasMany(i => i.AdditionalProperties)
.WithRequired(p => p.Item)
.HasForeignKey(p => p.ItemId);
HasMany(i => i.Properties)
.WithRequired(p => p.Item)
.HasForeignKey(p => p.ItemId);
HasMany(i => i.NextLevelRequirements)
.WithRequired(p => p.Item)
.HasForeignKey(p => p.ItemId);
HasMany(i => i.Requirements)
.WithRequired(p => p.Item)
.HasForeignKey(p => p.ItemId);
有谁能告诉我我错过了什么以及为什么我会收到此错误? 其他属性,属性,NextLevelRequirements和Requirements都使用相同的模型类,这是问题,我应该为每个属性创建不同的模型类,即使它们是相同的?我应该使用复合键吗?
答案 0 :(得分:2)
尝试删除Item
类中的构造函数以及相同类型的多个导航属性。 EF将为您的导航属性创建实例方面的所有艰苦工作,因此您不需要这样做。同样,您的流畅api配置将需要松开与Property
的1:M关系的额外定义。
public class Item
{
public int ItemId { get; set; }
public virtual ICollection<Property> Properties { get; set; }
}
public class Property
{
public int PropertyId { get; set; }
public int ItemId { get; set; }
public string Name { get; set; }
public int? DisplayMode { get; set; }
public int? Type { get; set; }
public int? Progress { get; set; }
public Item Item { get; set; }
public virtual ICollection<PropertyValue> Values { get; set; }
}
这将创建两个表 - 一个用于Item
,另一个用于Property
,具有1:M关系。