C# 未加载关系xx,因为类型xx不可用

C# 未加载关系xx,因为类型xx不可用,c#,asp.net,ef-code-first,ef-fluent-api,C#,Asp.net,Ef Code First,Ef Fluent Api,当我尝试为我的代码优先上下文创建迁移时,出现以下错误: 错误:未加载关系“Failaded\u Trader.Models.TradeContexts.Item\u AdditionalProperties”,因为类型“Failaded\u Trader.Models.TradeContexts.Property”不可用 我的项目模型与属性表有多个多对多关系,这些关系在几个不同的属性中使用。下面是它的样子: public class Item { public Item

当我尝试为我的代码优先上下文创建迁移时,出现以下错误:

错误:未加载关系“Failaded\u Trader.Models.TradeContexts.Item\u AdditionalProperties”,因为类型“Failaded\u 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; }
        }
谁能告诉我我遗漏了什么,为什么我会犯这个错误?
其他属性、属性、NextLevelRequirements和需求都使用相同的模型类,这是问题所在吗?我是否应该为每个属性创建不同的模型类,即使它们是相同的?我是否应该改为使用复合键?

尝试删除
类中的构造函数以及相同类型的多个导航属性。EF将为您的导航属性创建实例,因此您无需这样做。同样,您的fluent api配置将需要取消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; }
    }
公共类项目
{
公共int ItemId{get;set;}
公共虚拟ICollection属性{get;set;}
}
公共类财产
{
公共int属性ID{get;set;}
公共int ItemId{get;set;}
公共字符串名称{get;set;}
公共int?显示模式{get;set;}
公共int?类型{get;set;}
公共int?进程{get;set;}
公共项项{get;set;}
公共虚拟ICollection值{get;set;}
}

这将创建两个表—一个用于
,另一个用于
属性
,具有1:M关系。

尝试删除构造函数以及
类中相同类型的多个导航属性。EF将为您的导航属性创建实例,因此您无需这样做。同样,您的fluent api配置将需要取消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; }
    }
公共类项目
{
公共int ItemId{get;set;}
公共虚拟ICollection属性{get;set;}
}
公共类财产
{
公共int属性ID{get;set;}
公共int ItemId{get;set;}
公共字符串名称{get;set;}
公共int?显示模式{get;set;}
公共int?类型{get;set;}
公共int?进程{get;set;}
公共项项{get;set;}
公共虚拟ICollection值{get;set;}
}

这将创建两个表-一个用于
项目
,另一个用于
属性
,具有1:M关系。

为什么在项目类中有4个
属性
列表?您认为这将如何反映在DB模式中。另外,为什么要在构造函数中实例化列表?EF将为您创建导航属性。总而言之,您的模式在这一点上有很大的缺陷。试着用你们的模式表达你们想要实现的目标。在数据库中我想要一个属性表。我希望ef中的项目模型在4个不同的属性中引用此表,这些属性都存储在属性表中。我还希望项中的这4个不同属性引用属性对象的不同实例(不是相同实例)。另外,我在构造函数中实例化了我的列表,因为我的教程中有人说我应该这么做,我想这是不需要的。为什么在你的item类中有4个
属性的列表?您认为这将如何反映在DB模式中。另外,为什么要在构造函数中实例化列表?EF将为您创建导航属性。总而言之,您的模式在这一点上有很大的缺陷。试着用你们的模式表达你们想要实现的目标。在数据库中我想要一个属性表。我希望ef中的项目模型在4个不同的属性中引用此表,这些属性都存储在属性表中。我还希望项中的这4个不同属性引用属性对象的不同实例(不是相同实例)。此外,我还在构造函数中实例化我的列表,因为我的教程中有人说我应该这么做,我想这是不需要的。这可能会起作用,但我希望我可以有4个不同的一对多属性,所有这些属性都链接到属性表。如果不在属性模型中定义“propertyType”列,我如何区分我要访问哪种类型的属性呢?当然,你不能,但即使是你最初的方法也不会起作用,因为所有这4个列表都包含相同的元素,因为没有其他标准来分隔它们。如果您希望将此自定义分隔为4个不同的列表,那么您将考虑创建另一个模型类并手动映射,或者使用类似于
Automapper
的方法从EF将返回的1个列表中创建4个不同的列表。我假设您在
属性
类中的
类型
属性是您希望用来分隔这些列表的附加条件。它甚至不可能与复合键一起使用?从数据库的角度看不可能,因为您将在
属性
类中定义复合键,但仍然链接到单个
使用ItemId。你这样做是因为你在代码库中看到很多用例,你需要按属性类型过滤主列表,以获得你试图在这里创建的4个列表中的一个?我认为这样设置会很方便,因为所有这些属性都有完全相同的声明,我不想这样做复制品
    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; }
    }