由于类型''不可用,因此未加载关系''

时间:2015-10-24 12:25:19

标签: .net entity-framework ef-code-first

最近我一直在学习实体框架,为midcore手机游戏创建了宁静的服务器。首先,我遇到的问题与问题的标题完全相同。

我的解决方案中已经有2个项目首先是存储库,它包括我的实体,服务器的功能以及所有这些。第二个是带有模型的Web应用程序。

我一直致力于清理更好的数据库结构。但在重构​​之后,我犯了一些错误,现在我收到了这个错误:

  

“exceptionMessage”:“指定的架构无效。错误:未加载关系'Server.Character_WeaponItem',因为'Server.Item'类型不可用。”

我无法弄清楚我做错了什么。请给我一些描述,以便我更好地理解这个问题。

我的结构:

项目实体:

namespace Server
{
    public class Item
    {
        public int Id { get; set; }
        public int UserId { get; set; }
        public int ItemTemplateId{ get; set; }
        public int Level { get; set; }
        public int LevelProgress { get; set; }
        public int Count { get; set; }

        public User User { get; set; }
        public ItemTemplate ItemTemplate { get; set; }
        public Rune RuneSlotOne { get; set; }
        public Rune RuneSlotTwo { get; set; }
        public Rune RuneSlotThree { get; set; }
        public Character Owner { get; set; }

    }
}

角色实体:

namespace Server
{
    public class Character
    {

        public int Id { get; set; }
        public int UserId { get; set; }
        public int CharacterTemplateId { get; set; }
        public int Level { get; set; }
        public int LevelProgress { get; set; }

        public User User { get; set; }
        public CharacterTemplate CharacterTemplate { get; set; }
        public Item WeaponItem { get; set; }
        public Item AdditionalItem { get; set; }

     }
}

现在为他们制作Mappers:

namespace Server.Mappers
{
public class CharacterMapper : EntityTypeConfiguration<Character>
{
    public CharacterMapper()
    {
        HasKey(c => c.Id);
        Property(c => c.Id).IsRequired();
        Property(c => c.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        HasRequired(c => c.User).WithMany(u => u.Characters).HasForeignKey(c => c.UserId);
        HasRequired(t => t.CharacterTemplate).WithMany(c => c.Characters).HasForeignKey(t => t.CharacterTemplateId);

        HasOptional(r => r.WeaponItem)
            .WithOptionalDependent(item => item.Owner)
            .Map(map=>map.MapKey("WeaponId"));

        HasOptional(r => r.AdditionalItem)
            .WithOptionalDependent(item => item.Owner)
            .Map(configuration => configuration.MapKey("AdditionalItemId"));

    }
}
}

最后一项mapper:

public class ItemMapper : EntityTypeConfiguration<Item>
{
    public ItemMapper()
    {
        HasKey(i => i.Id);
        Property(i => i.Id).IsRequired();
        Property(i => i.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        HasRequired(i => i.User).WithMany(i => i.Items).HasForeignKey(i => i.UserId);

        HasRequired(i => i.ItemTemplate).WithMany(i => i.Items).HasForeignKey(i => i.ItemTemplateId);

        Property(i => i.Count).IsOptional();

        Property(i => i.Level).IsRequired();

        Property(i => i.LevelProgress).IsRequired();

        HasOptional(i => i.RuneSlotOne)
            .WithOptionalDependent(rune => rune.ItemOwner)
            .Map(configuration => configuration.MapKey("RuneOneId"));

        HasOptional(i => i.RuneSlotTwo)
            .WithOptionalDependent(rune => rune.ItemOwner)
            .Map(configuration => configuration.MapKey("RuneTwoId"));

        HasOptional(i => i.RuneSlotThree)
            .WithOptionalDependent(rune => rune.ItemOwner)
            .Map(configuration => configuration.MapKey("RuneThreeId"));


    }
}

哦,我正在寻找相关的帖子,但是有很多相同的消息,我不知道如何开始寻找问题。

1 个答案:

答案 0 :(得分:0)

所以我一直在考虑ef代码的第一个问题,但这就是关系设计问题。

字符可以有项目(对于我的示例可以有两个项目)但是可以附加项目。因此,角色必须为其项目进行导航,并且项目必须具有角色所有者的可选位置。

解决方案是:

public class ItemMapper : EntityTypeConfiguration<Item>
{
    public ItemMapper()
    {
        HasKey(i => i.Id);
        Property(i => i.Id).IsRequired();
        Property(i => i.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        HasRequired(i => i.User).WithMany(i => i.Items).HasForeignKey(i => i.UserId);

        HasRequired(i => i.ItemTemplate).WithMany(i => i.Items).HasForeignKey(i => i.ItemTemplateId);

        Property(i => i.Count).IsOptional();

        Property(i => i.Level).IsRequired();

        Property(i => i.LevelProgress).IsRequired();

        HasOptional(item => item.Owner)
            .WithMany(character => character.Items)
            .Map(configuration => configuration.MapKey("OwnerId"));

    }
}

然后项目:

public class Item
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public int ItemTemplateId{ get; set; }
    public int Level { get; set; }
    public int LevelProgress { get; set; }
    public int Count { get; set; }

    public User User { get; set; }
    public ItemTemplate ItemTemplate { get; set; }
    public ICollection<Rune> RuneSlots { get; set; } 
    public Character Owner { get; set; }

}

字符脚本:

public class CharacterMapper : EntityTypeConfiguration<Character>
{
    public CharacterMapper()
    {
        HasKey(c => c.Id);
        Property(c => c.Id).IsRequired();
        Property(c => c.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        HasRequired(c => c.User).WithMany(u => u.Characters).HasForeignKey(c => c.UserId);
        HasRequired(t => t.CharacterTemplate).WithMany(c => c.Characters).HasForeignKey(t => t.CharacterTemplateId);


    }
}

字符:

public class Character
{
    public Character()
    {
        Items = new List<Item>();
    }

    public int Id { get; set; }
    public int UserId { get; set; }
    public int CharacterTemplateId { get; set; }
    public int Level { get; set; }
    public int LevelProgress { get; set; }

    public User User { get; set; }
    public CharacterTemplate CharacterTemplate { get; set; }
    public ICollection<Item> Items { get; set; } 


}
相关问题