C# 使用数据库表作为对象?

C# 使用数据库表作为对象?,c#,sql,linq,linq-to-sql,C#,Sql,Linq,Linq To Sql,我刚开始着手一个现有的(正在启动的)项目,目的是在结构和性能上对其进行重组。我通常使用EF作为框架,但我也熟悉LINQtoSQL和ADO。我看到的是,目前web应用程序正在使用实际的数据库表和视图作为代码中的对象,因此,例如,您有表“foo”,他们将继续使用它作为对象,而不是使用类在应用程序中传递数据,最后将其插入DB/表中。因为我从来没有看到过,也没有意识到这一点,我想知道,这是一个“好”的做法吗?我的意思是,微软确实让这样做成为可能,那么“真正”的目的是什么,有什么优点/缺点 谢谢大家的回复

我刚开始着手一个现有的(正在启动的)项目,目的是在结构和性能上对其进行重组。我通常使用EF作为框架,但我也熟悉LINQtoSQL和ADO。我看到的是,目前web应用程序正在使用实际的数据库表和视图作为代码中的对象,因此,例如,您有表“foo”,他们将继续使用它作为对象,而不是使用类在应用程序中传递数据,最后将其插入DB/表中。因为我从来没有看到过,也没有意识到这一点,我想知道,这是一个“好”的做法吗?我的意思是,微软确实让这样做成为可能,那么“真正”的目的是什么,有什么优点/缺点

谢谢大家的回复!
我以前见过在Java和C中用作对象的存储库。我怀疑这就是你在这里所说的。如果是这样,就有一个重大的权衡。与mot工具一样,如何使用它比使用它更重要,因此了解折衷更重要,有一个全面的使用规则

通常使用存储库,我们有一个负责存储和获取数据的对象。这可以像数据库表一样工作,但实际上是一种抽象,它位于数据库和应用程序之间。您将对象持久化到其中,并从中请求对象。存储库不知道对象的内部结构,只知道如何存储或获取它们。例如,这是春季常见的模式

存储库与数据访问对象非常相似(事实上,有些人认为它们是相同的,而另一些人认为它们不是)

这样做的好处是,您有了这种抽象,因此,如果以后您想将对象存储在其他地方(比如,您想将它们写入Kafka,然后再将它们写入数据库),您就有了一个可以这样做的存储库。因此,存储库不必告诉您如何获取或保存数据。它只需要实现一个您决定要实现的API

这里的一个主要优点是,您可以将业务逻辑与持久性逻辑分开(这意味着您可以更改其中一个而不必担心另一个)。缺点是这些仍然是紧密耦合的,因此抽象并不像您想象的那样为您带来很多好处,而且它的复杂性比您想象的要高


我确信SQL Server中有代码生成器可以对表执行此操作。然而,当你这么做的时候,你或多或少地将自己与代码生成器的API决策捆绑在一起,这在一定程度上破坏了将抽象放在那里的初衷。

我以前见过存储库在Java和C中用作对象。我怀疑这就是你在这里所说的。如果是这样,就有一个重大的权衡。与mot工具一样,如何使用它比使用它更重要,因此了解折衷更重要,有一个全面的使用规则

通常使用存储库,我们有一个负责存储和获取数据的对象。这可以像数据库表一样工作,但实际上是一种抽象,它位于数据库和应用程序之间。您将对象持久化到其中,并从中请求对象。存储库不知道对象的内部结构,只知道如何存储或获取它们。例如,这是春季常见的模式

存储库与数据访问对象非常相似(事实上,有些人认为它们是相同的,而另一些人认为它们不是)

这样做的好处是,您有了这种抽象,因此,如果以后您想将对象存储在其他地方(比如,您想将它们写入Kafka,然后再将它们写入数据库),您就有了一个可以这样做的存储库。因此,存储库不必告诉您如何获取或保存数据。它只需要实现一个您决定要实现的API

这里的一个主要优点是,您可以将业务逻辑与持久性逻辑分开(这意味着您可以更改其中一个而不必担心另一个)。缺点是这些仍然是紧密耦合的,因此抽象并不像您想象的那样为您带来很多好处,而且它的复杂性比您想象的要高


我确信SQL Server中有代码生成器可以对表执行此操作。然而,当你这么做的时候,你或多或少地将自己与代码生成器的API决策捆绑在一起,这在一定程度上破坏了最初在那里进行抽象的目的。

因此,既然你喜欢我的评论,我将展开讨论。假设我有桌子

Foo
FooId int 
Desc varchar(32)

Bar
BarId int
Desc varchar(32)
现在让我们假设我实际上还有很多,比如说50张桌子。我不想用手工创造所有这些,因为这有点疯狂。回到ADO.NET时代,您将创建数据表,并可能手工创建格式良好的对象。使用LINQtoSQL,他们制作了一个文档来为您处理大多数建模,但它仅限于与数据库的外观几乎相同。但有了实体框架,微软又向前迈出了一步。现在有了数据库层、中间层和对象层。只需说,您甚至可以在“上下文”所需的基础上操作和创建对象

但撇开所有这些不谈,假设我创建了一个实体框架6.1.3模型,然后选择我的数据库,然后首先选择数据库。我在添加对象时得到了一个模型表示,它们存储在上下文中。就EF而言,这些对象是表。你只是做一些像

using(var context = new DBContext())
{
    var newFoo = new Foo { Id = 1, Desc = "A" };
    context.Foo.Add(newFood);
    context.SaveChanges();
}
我只是添加并保存了一个新的Foo对象,并且我不必为POCO对象创建任何代码。EF在运行自定义工具时为我做到了这一点,方法是选择模型对象,右键单击并选择“运行自定义工具”。本质上,这只是运行数据来生成POCO