针对多对多关系的实体框架表 - 层次结构方法

时间:2014-04-17 08:50:10

标签: c# .net entity-framework

我正在使用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的项目的持久性?

谢谢!

0 个答案:

没有答案