面向对象的数据库?

时间:2012-09-21 20:00:53

标签: c# .net entity-framework oop ado.net

我做了很多ADO.NET EF编程,但从来没有一个对象/表继承自另一个对象/表。

如果我有一个包含三个表(正方形,三角形,多边形)的现有数据库并添加一个ADO.NET模型以使Linq访问这些表,我该如何确定方形和三角形对象是否来自多边形? / p>

架构中是否要求父表中的列存在于子类的列中?

然后如果我想覆盖像ComputeArea()这样的方法怎么办?我会使用扩展方法还是有更好的方法?

我的基本问题是如何/在何处/如果面向对象编程为ORM带来价值,但我意识到在stackoverflow上不鼓励价值/主观问题。

3 个答案:

答案 0 :(得分:2)

  

如何确定方形和三角形对象的派生方式   多边形?

你最好看看这个:

Implementing Table Inheritance in SQL Server

  

然后如果我想覆盖像ComputeArea()这样的方法怎么办?将   我使用扩展方法还是有更好的方法?

扩展方法应该可以解决问题,让您的实体更像“值对象”。

  

我的基本问题是如何/在何处/是否面向对象编程   为ORM带来价值,但我意识到价值/主观问题   对stackoverflow不鼓励。

这正是其存在的原因(ORM),它们被称为对象关系映射。所以它确实带来了价值:更清晰的代码,易于编写,易于重构。

现在,据说,恕我直言的一个缺点是,当用户对底层存储技术没有任何经验时,ORM工具的使用不能像应有的那样高效,不一定是因为技术而是你使用它的方式(从使用面向对象和关系世界的连接的方式)或者你正在尝试做的事情,就是它,继承。这些事情在OO世界中非常简单,但在关系数据库中却没有必要。

答案 1 :(得分:1)

您可以让它们从基类继承。它将在两个表中创建相同的字段。如果您不想复制列,可以将方形和三角形的主键设置为多边形对象的主键,然后在这些对象上只有方形/三角形特定字段。

可以非常轻松地覆盖方法。只需确保将[NotMapped]属性放在它上面。

编辑:这适用于使用Code-First w / Data Annotations。

答案 2 :(得分:1)

方法=行为和行为是对象的一个​​方面,而不是数据。通过传统的OOP主体(如interhitance和SOLID设计)来维护ComputeArea()

将数据映射到对象有两个方面:

    每班
  1. 每个层次结构的表格
  2. 继承的快速代码段

    abstract class polygon
    {
        abstract decimal ComputeArea();
    }
    
    class Triangle : Polygon
    {
         public decimal Base {get;set;}
         public decimal Height {get;set;}
    
         public override decimal ComputeArea()
         {
              return Base * Height / 2;
         }
    }
    
    class class Square : Polygon
    {
         public decimal Side {get;set;}
    
         public override decimal ComputeArea()
         {
              return Side * 4;
         }
    }
    
    
    class class Circle : Polygon
    {
         public decimal Radius {get;set;}
    
         public override decimal ComputeArea()
         {
              return Math.Square(Math.Pi * Radius);
         }
    }