2

我很好奇在 ORM 方法中解决对象层次结构的任何解决方案(在本例中,使用实体框架 4)。我正在研究 EF4 上的一些文档,并尝试将其应用于简单的库存跟踪程序。可能的库存类型如下:

库存项目类型:

  • 硬件
    • 个人电脑
      • 桌面
      • 服务器
      • 笔记本电脑
    • 配饰
      • 输入(键盘、扫描仪等)
      • 输出(显示器、打印机等)
      • 存储(U 盘、磁带驱动器等)
      • 通信(网卡、路由器等)
  • 软件

在这种情况下处理枚举有什么建议?枚举甚至是解决方案吗?对于这样一个相对简单的实验(例如,InventoryType、InventorySubtype、InventoryTypeToSubtype 等的表),我真的不想拥有一个可笑的标准化数据库。我真的不想让我的数据模型过于复杂,因为每个子类型都被继承,即使没有包含额外的属性或方法(除了 PC 类型,理想情况下会有相关的附件和软件,但这可能超出了这里的范围)。

感觉应该有一个非常简单,优雅的解决方案,但我不能指望它。任何帮助或输入表示赞赏!

4

4 回答 4

1

您可以使用类型层次结构...

public interface IInventoryType
{
    string Name { get; }
}

public class Hardware : IInventoryType
{
    public string Name { get { return "Hardware"; } }

    public class PC : IInventoryType
    {
        public string Name { get { return "PC"; } }

        public class Desktop : IInventoryType
        {
            public string Name { get { return "Desktop"; } }
        }

        public class Server : IInventoryType
        {
            public string Name { get { return "Server"; } }
        }
    }
}

然后与他们合作可能看起来像这样......

IInventoryType invType = new Hardware.PC.Server();

if (invType is Hardware.PC.Server)
{
     Console.WriteLine("Yes!");
}
else
{
     Console.WriteLine("No!");
}

虽然它会起作用,但我不确定它是否有意义。这很容易变得复杂且难以维护。

这可能更适合作为数据存储在数据库中并编写代码以通用方式而不是特定方式处理数据。

每次添加新类型时,都需要更改代码,这并不理想。

于 2010-03-24T20:39:07.000 回答
1

您的问题的要点与 ORM 没有太大关系,它只是一个如何为您的要求制作良好的关系模型的问题。而且您已经给自己答案:如果您不想为每个枚举建模不同的表,请不要这样做。为您的 PC 类型、附件类型等使用整数属性,并将其映射到代码中定义的枚举。这样,无论何时扩展您的枚举之一,您都不必更改数据库中的任何内容(甚至任何枚举表中的数据)。

当然,在某些情况下,将枚举建模为单独的表是值得的。显然,当您必须将其他数据存储到您的枚举(如短名称、长名称、ID 等)时,就是这种情况。或者当您有不同的程序时,可能使用不同的编程语言,它们都需要处理同一组枚举。或者当用户应该能够扩展 PC 类型列表而不需要新版本的程序时。

于 2010-03-24T20:52:07.317 回答
1

我认为这需要一种复合设计模式: http: //www.dofactory.com/Patterns/PatternComposite.aspx

代码如下:

class InventoryItem
{
    public string Name { get; private set; }
    public InventoryItem Parent { get; private set; }
    public IList<InventoryItem> Children { get; private set; }
}

HTH。

于 2010-03-24T20:54:35.850 回答
1

这几乎不是“可笑的规范化”——事实上,一个自引用表就足以使用邻接列表模型将信息保存在数据库中:

Categories (CategoryID, CategoryName, ParentCategoryID)

同一张表上的引用ParentCategoryIDCategoryID

这可以映射到一个非常简单的实体类:

public class Category
{
    public string Name { get; set; }
    public Category ParentCategory { get; set; }
    public IList<Category> ChildCategories { get; set; }
}

这就是你要做的所有事情。如果您开始拥有非常深/宽的层次结构,那么您可能需要考虑替代模型来提高性能,但是鉴于此处的示例,您距离超越简单的邻接列表还有很长的路要走。

忘记枚举——它们在这里毫无意义。如果这是一个数据驱动的应用程序,您几乎肯定希望能够在不更改代码的情况下更改类别列表,而枚举类型需要您这样做。

于 2010-03-24T20:59:24.140 回答