C# 从数据库面向对象?
我已经做了很多ADO.NET EF编程,但从来没有一个对象/表继承另一个对象/表 如果我有一个包含三个表(正方形、三角形、多边形)的现有数据库,并添加一个ADO.NET模型以使我能够使用Linq访问这些表,那么如何确定正方形和三角形对象源自多边形 在父表中的列存在于子类的列中的模式中是否有要求 然后,如果我想重写一个类似ComputeArea()的方法呢?我会使用扩展方法还是有更好的方法 我的基本问题是面向对象编程如何/在何处/是否为ORM带来了价值,但我意识到价值/主观问题在stackoverflow上是不被鼓励的 如何确定正方形和三角形对象是从 多边形 你最好看看这个: 然后,如果我想重写一个类似ComputeArea()的方法呢?将 我使用扩展方法,还是有更好的方法 扩展方法应该做到这一点,最好让实体像值对象一样工作 我的基本问题是如何/在哪里/如果面向对象编程 为ORM带来价值,但我意识到价值/主观问题 不鼓励堆栈溢出 这正是它(ORM)存在的原因,这就是所谓的对象关系映射。因此,它确实带来了价值:更干净的代码,易于编写,易于重构 话虽如此,IMHO的一个缺点是,当用户对底层存储技术没有任何经验时,ORM工具的使用就不能达到应有的性能,这不一定是因为该技术,而是因为您使用它的方式(比如使用面向对象与关系世界的连接的方式)或者你想做的事情,就是继承。这些东西在OO世界中非常简单,但在关系数据库中不是必需的 如何确定正方形和三角形对象是从 多边形 你最好看看这个: 然后,如果我想重写一个类似ComputeArea()的方法呢?将 我使用扩展方法,还是有更好的方法 扩展方法应该做到这一点,最好让实体像值对象一样工作 我的基本问题是如何/在哪里/如果面向对象编程 为ORM带来价值,但我意识到价值/主观问题 不鼓励堆栈溢出 这正是它(ORM)存在的原因,这就是所谓的对象关系映射。因此,它确实带来了价值:更干净的代码,易于编写,易于重构C# 从数据库面向对象?,c#,.net,entity-framework,oop,ado.net,C#,.net,Entity Framework,Oop,Ado.net,我已经做了很多ADO.NET EF编程,但从来没有一个对象/表继承另一个对象/表 如果我有一个包含三个表(正方形、三角形、多边形)的现有数据库,并添加一个ADO.NET模型以使我能够使用Linq访问这些表,那么如何确定正方形和三角形对象源自多边形 在父表中的列存在于子类的列中的模式中是否有要求 然后,如果我想重写一个类似ComputeArea()的方法呢?我会使用扩展方法还是有更好的方法 我的基本问题是面向对象编程如何/在何处/是否为ORM带来了价值,但我意识到价值/主观问题在stackover
话虽如此,IMHO的一个缺点是,当用户对底层存储技术没有任何经验时,ORM工具的使用就不能达到应有的性能,这不一定是因为该技术,而是因为您使用它的方式(比如使用面向对象与关系世界的连接的方式)或者你想做的事情,就是继承。这些东西在OO世界中非常简单,但在关系数据库中不是必需的。您可以让它们从基类继承。它将在两个表中创建相同的字段。如果不想复制列,可以将正方形和三角形的主键设为多边形对象的主键,然后在这些对象上只设置特定于正方形/三角形的字段 重写该方法非常容易。只需确保将[NotMapped]属性置于其上即可
编辑:这适用于使用代码优先和数据注释。您可以让它们从基类继承。它将在两个表中创建相同的字段。如果不想复制列,可以将正方形和三角形的主键设为多边形对象的主键,然后在这些对象上只设置特定于正方形/三角形的字段 重写该方法非常容易。只需确保将[NotMapped]属性置于其上即可
编辑:这适用于使用带有数据注释的代码优先。方法=行为,行为是对象的一个方面,而不是数据。to
ComputeArea()
是通过传统的OOP原则(如交互和实体设计)来维护的
将数据映射到对象有两种方式:
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);
}
}
方法=行为,行为是对象的一个方面,而不是数据。to
ComputeArea()
是通过传统的OOP原则(如交互和实体设计)来维护的
将数据映射到对象有两种方式:
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);
}
}
这个链接很有帮助。我仍然不确定如何处理来自数据库表的对象(例如:如果我想编写一个可以处理正方形和三角形的通用方法,该怎么办?)。。。但这应该是另一个问题。最后的评论很有帮助。当我想到OOP时,我总是想到继承,但我不确定ORM的对象部分是否意味着继承。@Michahoover你尝试过代码优先的方法吗?相信我,这将大大简化从OO到ORM的转换。我在家里已经尝试过CodeFirst。我想我通常可以这样声明我的方法/继承,但我认为与我一起工作的ETL人员会反对这样做(特别是因为我们的数据库是Oracle,我使用ODP/.NET包装器)。谢谢你的提示。链接很有帮助。我仍然不确定如何处理来自数据库表的对象(例如:如果我想编写一个可以处理正方形和三角形的通用方法,该怎么办?)。。。但这应该是另一个问题。最后的评论很有帮助。我总是