C# 从数据库面向对象?

C# 从数据库面向对象?,c#,.net,entity-framework,oop,ado.net,C#,.net,Entity Framework,Oop,Ado.net,我已经做了很多ADO.NET EF编程,但从来没有一个对象/表继承另一个对象/表 如果我有一个包含三个表(正方形、三角形、多边形)的现有数据库,并添加一个ADO.NET模型以使我能够使用Linq访问这些表,那么如何确定正方形和三角形对象源自多边形 在父表中的列存在于子类的列中的模式中是否有要求 然后,如果我想重写一个类似ComputeArea()的方法呢?我会使用扩展方法还是有更好的方法 我的基本问题是面向对象编程如何/在何处/是否为ORM带来了价值,但我意识到价值/主观问题在stackover

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

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

在父表中的列存在于子类的列中的模式中是否有要求

然后,如果我想重写一个类似ComputeArea()的方法呢?我会使用扩展方法还是有更好的方法

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

如何确定正方形和三角形对象是从 多边形

你最好看看这个:

然后,如果我想重写一个类似ComputeArea()的方法呢?将 我使用扩展方法,还是有更好的方法

扩展方法应该做到这一点,最好让实体像值对象一样工作

我的基本问题是如何/在哪里/如果面向对象编程 为ORM带来价值,但我意识到价值/主观问题 不鼓励堆栈溢出

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

话虽如此,IMHO的一个缺点是,当用户对底层存储技术没有任何经验时,ORM工具的使用就不能达到应有的性能,这不一定是因为该技术,而是因为您使用它的方式(比如使用面向对象与关系世界的连接的方式)或者你想做的事情,就是继承。这些东西在OO世界中非常简单,但在关系数据库中不是必需的

如何确定正方形和三角形对象是从 多边形

你最好看看这个:

然后,如果我想重写一个类似ComputeArea()的方法呢?将 我使用扩展方法,还是有更好的方法

扩展方法应该做到这一点,最好让实体像值对象一样工作

我的基本问题是如何/在哪里/如果面向对象编程 为ORM带来价值,但我意识到价值/主观问题 不鼓励堆栈溢出

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


话虽如此,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包装器)。谢谢你的提示。链接很有帮助。我仍然不确定如何处理来自数据库表的对象(例如:如果我想编写一个可以处理正方形和三角形的通用方法,该怎么办?)。。。但这应该是另一个问题。最后的评论很有帮助。我总是