关系 xx 未加载,因为类型 xx 不可用
The relationship xx was not loaded because the type xx is not available
当我尝试为我的代码优先上下文创建迁移时,出现此错误:
错误:关系 'Exiled_Trader.Models.TradeContexts.Item_AdditionalProperties' 未加载,因为类型 'Exiled_Trader.Models.TradeContexts.Property' 不可用。
我的项目模型与 属性 table 有不止一对多的关系,这些关系用于几个不同的属性。这是它的样子:
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 fluent 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);
谁能告诉我我错过了什么以及为什么我会收到此错误?
Additional Properties、Properties、NextLevelRequirements 和 Requirements 都使用相同的模型 class,这是问题所在吗?我是否应该为每个属性制作不同的模型 class,即使它们是相同的?我应该改用复合键吗?
尝试删除构造函数以及 Item
class 中相同类型的多个导航属性。 EF 将完成为您的导航属性创建实例的所有艰苦工作,因此您无需这样做。同样,您的流畅 api 配置将需要放宽 1:M 与 Property
关系的额外定义。
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 关系。
当我尝试为我的代码优先上下文创建迁移时,出现此错误:
错误:关系 'Exiled_Trader.Models.TradeContexts.Item_AdditionalProperties' 未加载,因为类型 'Exiled_Trader.Models.TradeContexts.Property' 不可用。
我的项目模型与 属性 table 有不止一对多的关系,这些关系用于几个不同的属性。这是它的样子:
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 fluent 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);
谁能告诉我我错过了什么以及为什么我会收到此错误? Additional Properties、Properties、NextLevelRequirements 和 Requirements 都使用相同的模型 class,这是问题所在吗?我是否应该为每个属性制作不同的模型 class,即使它们是相同的?我应该改用复合键吗?
尝试删除构造函数以及 Item
class 中相同类型的多个导航属性。 EF 将完成为您的导航属性创建实例的所有艰苦工作,因此您无需这样做。同样,您的流畅 api 配置将需要放宽 1:M 与 Property
关系的额外定义。
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 关系。