最近我一直在学习实体框架,为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"));
}
}
哦,我正在寻找相关的帖子,但是有很多相同的消息,我不知道如何开始寻找问题。
答案 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; }
}