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

时间:2018-03-11 16:07:43

标签: c# asp.net ef-code-first ef-fluent-api

当我尝试为我的代码第一个上下文创建迁移时,我收到此错误:

错误:未加载“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都使用相同的模型类,这是问题,我应该为每个属性创建不同的模型类,即使它们是相同的?我应该使用复合键吗?

1 个答案:

答案 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关系。