我正在使用Entity Framework Code-First进行小型宠物项目:一个基于浏览器的简单游戏。我试图为我的" items系统"提供合理的数据库结构。这也很好地映射到我的继承模型,但我在这里遇到了一些与EF有关的问题。让我先说明一下情况:
项目本身是我模型中的唯一实体。有不同的项目类型(例如" Weapon"," Armor")为此我使用Table-Per-Hierarchy继承。我的items类的基本示例如下所示:
public enum ItemType
{
Unspecified,
Weapon,
Armor
}
[Table("Items")]
public abstract class Item
{
[Key, Column(Order = 1)]
public Guid Id { get; set; }
[Column]
public ItemType Type { get; set; }
[Column]
public string Name { get; set; }
}
public class Weapon : Item
{
[Column]
public int MinDamage { get; set; }
[Column]
public int MaxDamage { get; set; }
}
在我的模型创建代码中,我添加了以下内容以确保EF使用我的自定义鉴别器(ItemType):
modelBuilder.Entity<Item>()
.Map<Weapon>(m => m.Requires("Type").HasValue((int)ItemType.Weapon))
.Map<Armor>(m => m.Requires("Type").HasValue((int)ItemType.Armor));
到目前为止,这一切都很好;我现在面临的挑战是将项目连接到角色。从数据库架构的角度来看,我似乎很清楚我应该只有一个CharactersAndItems
表。这样我不仅可以通过游戏中的角色来表示项目所有权,还可以为给定项目添加特定于角色的数据;例如项目耐久性。然而,在代码中表示这一点已经证明有点棘手。
如果我添加一个CharacterAndItem
类,理想情况下我会让这个类保持对它所连接的Item
实例的引用,但是后来我遇到了无法获得正确的问题该项目引用的派生类(我认为Item
是一个抽象类并不能完全帮助这里。)
所以我想我的问题归结为:如何正确表示项目所有权和元数据,例如使用Entity Framework Code First的项目的持久性?
谢谢!