我做了很多ADO.NET EF编程,但从来没有一个对象/表继承自另一个对象/表。
如果我有一个包含三个表(正方形,三角形,多边形)的现有数据库并添加一个ADO.NET模型以使Linq访问这些表,我该如何确定方形和三角形对象是否来自多边形? / p>
架构中是否要求父表中的列存在于子类的列中?
然后如果我想覆盖像ComputeArea()这样的方法怎么办?我会使用扩展方法还是有更好的方法?
我的基本问题是如何/在何处/如果面向对象编程为ORM带来价值,但我意识到在stackoverflow上不鼓励价值/主观问题。
答案 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()
。
将数据映射到对象有两个方面:
继承的快速代码段
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);
}
}