1

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

如果我有一个包含三个表(正方形、三角形、多边形)的现有数据库并添加一个 ADO.NET 模型以使我能够 Linq 访问这些表,我如何确定正方形和三角形对象派生自多边形?

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

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

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

4

3 回答 3

2

如何确定正方形和三角形对象来自多边形?

你最好看看这个:

在 SQL Server 中实现表继承

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

扩展方法应该可以解决问题,最好让您的实体表现得像值对象。

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

这正是它(ORM)存在的原因,也就是他们所谓的对象关系映射。所以它确实带来了价值:更简洁的代码、易于编写、易于重构。

现在,话虽如此,恕我直言的一个缺点是,当用户对底层存储技术没有任何经验时,ORM 工具的使用就不能达到应有的性能,不一定是因为技术,而是因为你的方式使用它(至于使用面向对象与关系世界的连接的方式)或诸如您正在尝试做的事情之类的事情,就是这样,继承。这些事情在 OO 世界中非常简单,但在关系数据库中却不是必需的。

于 2012-09-21T20:03:24.187 回答
1

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

覆盖该方法可以很容易地完成。只要确保将 [NotMapped] 属性放在它上面。

编辑:这适用于使用带数据注释的代码优先。

于 2012-09-21T20:04:57.010 回答
1

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

将数据映射到对象有两种形式:

  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);
     }
}
于 2012-09-21T20:05:24.247 回答