Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非常规数据库布局的数据访问模式_C#_Design Patterns_Data Access Layer - Fatal编程技术网

C# 非常规数据库布局的数据访问模式

C# 非常规数据库布局的数据访问模式,c#,design-patterns,data-access-layer,C#,Design Patterns,Data Access Layer,我已经开始维护一个应用程序,它带有一个很大的数据库,部分还没有规范化/相当混乱。大量重复数据和一些包含大量字段的表(30+)。例如,我有一个名为Orders的表,其中包含很多字段。我会将这个表拆分,但不允许更改数据库布局。现在,如果我坚持使用repository模式,我相信我应该创建一个Order实体及其CRUD方法。问题是,业务逻辑几乎从不要求加载/更新整个订单实体,而只要求加载/更新一个子集。这将构成许多实体(如FullOrder、OrderMetaInfo、OrderProcessingD

我已经开始维护一个应用程序,它带有一个很大的数据库,部分还没有规范化/相当混乱。大量重复数据和一些包含大量字段的表(30+)。例如,我有一个名为Orders的表,其中包含很多字段。我会将这个表拆分,但不允许更改数据库布局。现在,如果我坚持使用repository模式,我相信我应该创建一个Order实体及其CRUD方法。问题是,业务逻辑几乎从不要求加载/更新整个订单实体,而只要求加载/更新一个子集。这将构成许多实体(如FullOrder、OrderMetaInfo、OrderProcessingDetails等)

我的问题是,处理这种数据库混乱的最佳方法是什么?我正在考虑创建一个名为Orders的简单类,前面提到的实体是POCO,而不是像updateOrderMetanfo()或GetOrderProcessingDetails()这样的方法。这似乎是一个很好的方法,直到您开始思考,有两个表,一个是Orders,另一个是ArchivedOrders(不,字段不完全相同,但非常相似-甚至不要问)。看来我将在大量重复代码中运行。现在我开始考虑编写一个非常简单的数据库访问类,在这个类中,您传入一个手工sql查询,然后返回一个recordsset,就像在过去的好日子一样。你有比这更好的主意吗

事实和限制:它是一个Sql数据库,项目是用C#编写的。另一个系统使用相同的数据库,因此更改数据库布局不是一个选项。使用EF或任何第三方产品进行数据访问也不是一种选择


很抱歉发布了这么长的帖子,感谢您的反馈。

为什么不使用属性设置器来实际“标记”需要更新的内容呢

例如,用户可以这样做

Order.Client = "Jorge";
Order.Price = 300;
Order.Provider = "Microsoft";
然后你的二传手看起来像

public string Client{
set
{
  mClient = value;
  ModifiedFields.Add("ClientField");
}
最后,更新方法将根据ModifiedFields信息决定需要运行的实际查询,以便更新修改的字段

要实际检索数据,如果查询没有那么慢,或者。。。如果它的权重真的足以影响性能,那么让每个属性的getter通过缓存策略或向属性提供GetLastValue来检索给定数据子集所需的信息

例如:

public class DBField<T>
{
  private DBCommand getCommand;

  public T Value {get;set;}
  public T GetLastValue()
  {
     // Execute getCommand here
  }

  public DBField<T>(DBCommand GetCommand)
  {
    this.getCommand = GetCommand;
  }
}

我在工作中也遇到了类似的情况


我处理它的方法是创建一个新的数据库,它只包含对现有数据库的视图。然后,我们的应用程序将视图用于所有crud操作

这似乎是每个其他开发人员都遇到过的问题。。。这个不改变数据库的要求很糟糕,但是如果你必须坚持下去,我可以分享我用一个非常接近的应用程序所做的一些事情。。。我曾经拥有具有Linq到Sql数据上下文的DAO对象。我同意Order实体不需要完全加载,但我们解决这个问题的方法是使用linq to sql的一些优点,如下所述:

请特别注意数据加载选项和编译后的查询


我必须告诉你,这不是最好的解决方案,但是可行的,你可以用Linq to Sql保持代码的整洁,这不是什么很复杂的事情。。。希望这对您有所帮助。

让您使用db更改其他应用程序,并向他们推销!
string Client = Orders["Id"].Client.GetLastValue();