【问题标题】:An alternative lookup table approach needed to make C# models more generic使 C# 模型更通用所需的替代查找表方法
【发布时间】:2013-08-11 09:18:20
【问题描述】:

我的 EF Code First MVC 项目中目前有以下模型(为简洁起见进行了编辑):

public class Car
{
    public int Id { get; set; }
    public string Descrip { get; set; }

    // Navigation Property.
    public virtual CarColour CarColour { get; set; }
    ... + numerous other navigation properties.
}

public class CarColour
{
    public int Id { get; set; }
    public string ColourName { get; set; }
}

数据库中的 CarColour 表包含许多行。

在我的项目中,我有大约 10 个此类表,它们本质上是查找表。

我的任务是实现一种更可重用的方法,而不是拥有 10 个查找表(以及代码中 10 个相应的“硬”类型),而不是拥有大量特定于 Car 的查找表(在此示例中),沿着有几个表的思路,其中一个可以保存项目类型(颜色、燃料类型等),另一个包含每种类型的各种值。我们的想法是我们的​​模型将能够被许多其他项目重用——其中一些可能具有数百种不同的属性,因此,我们不想在代码中创建新的类/类型并生成每个都有一个新的查找表。

我很难理解这种方法的 c# 实现,希望有人能给我一个示例,说明如何在代码中实现这一点,更具体地说,上述模型需要如何更改,以及需要哪些额外的类来完成此操作?

【问题讨论】:

  • 让持久性决定业务逻辑是发现自己处于数据没有意义的位置的好方法。通过允许其他代码直接访问您的持久性来加剧这种情况只是自找麻烦。
  • 在我看来,您会添加和删除颜色,因此您将拥有数据库中不再列出颜色的汽车的历史记录。这将向我表明非规范化将是要走的路。您的颜色表仅用作当前颜色的查找,但是当将颜色分配给车辆时,它会与车辆记录一起移动,而不是作为关系。所以我建议非规范化。
  • 汽车和颜色只是试图满足我的要求的一个例子。我最终需要一个“项目”,它可以有 x 个不同的属性/值与之关联,并且这需要尽可能通用,因此可以在针对不同项目的其他应用程序中重用相同的表模式和通用类(例如船,枪支等)
  • 我不得不质疑这里的一般方法。为什么你不能做最简单的事情,即为唯一对象创建唯一表?您能否详细说明您的用例?

标签: c# database-design model


【解决方案1】:

您的基础实体必须实现 INotifyPropertyChanged 并使其具有通用性:

public virtual CarColour CarColour {
 Get { return this.carColour; }
 Set {
     this.Carcolour; = value
     OnPropertyChanged("CarColour");
     }
}

有关更多信息,请参阅: 模式和实践:CodePlex 中的 Prism。 http://compositewpf.codeplex.com/wikipage?title=Model%20View%20ViewModel%20(MVVM)

问候 巴萨姆

【讨论】:

    【解决方案2】:

    这不一定是 EF 特有的,但我一直在这条路上,并不真正喜欢它。

    我想使用一个表格来表示“通用”信息,虽然我认为它很聪明,但很快就显示出它的局限性。其中之一是您在编写查询以提取此数据时需要引入的复杂性,如果您执行的不仅仅是“获取这辆车的颜色”。

    我会说,如果您的数据是简单的键/值,并且值类型总是相同的,那么就去做吧,它甚至可能值得为一个对象提供一个简单的“元数据”:

    public class Car
    {
        public int Id { get; set; }
        public string Descrip { get; set; }
        public MetaData CarColours { get; set; }
    }
    
    public MetaData : Dictionary<int, string>
    {
        public MetaData(int group){}
    }
    

    假设表格:

    TableMetaData(int metaGroup, int metaId, string metaValue)
    

    如果您希望将不同的类型存储为您的值,并且可能需要对此数据执行连接 - 避免使用它并更具体一点。

    【讨论】:

      猜你喜欢
      • 2018-10-02
      • 2018-09-24
      • 2019-01-17
      • 2018-07-03
      • 2016-02-29
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      • 2013-02-13
      相关资源
      最近更新 更多