将 LINQ 子类化为 SQL 数据实体 - 坏主意或缺少某些内容

本文关键字:子类 LINQ SQL 实体 数据 | 更新日期: 2023-09-27 17:56:37

我希望能够将自动生成的 LINQ 子类化为 SQL 数据类,并保存对所述对象的更改。

例如,如果我的数据库中有一个表Client,我可以创建扩展类ClientClientBO,并添加诸如GenerateInvoice()之类的行为。一切正常,直到我想更新子类中的值或插入新记录。这些变化(可以预见?)被丢弃了。我是否缺少什么,或者我首先创建这些子类是否违反了 LINQ to SQL 或 OO 原则?

以下是我的代码的简化示例:

public class ClientBO : Client
{
    public ClientBO( Client source ) : base()
    {
        FirstName = source.FirstName;
        Lastname = source.LastName;
        // ... etc ...
    }
}
List<ClientBO> clientList = 
    ( from client in DatabaseContext.Clients select new ClientBO( client ) ).ToList();
clientList[ someIndex ].SomeField = NewValue;
MyDatabaseContext.SubmitChanges();

将 LINQ 子类化为 SQL 数据实体 - 坏主意或缺少某些内容

问题是您要更改的对象不再是从数据存储中获取的对象。

数据上下文跟踪对其附加的所有对象的更改。但是,由于您永远不会更改所引用的"源"对象,因此数据上下文永远不会收到更改通知

我建议你把你的ClientBO变成Client的部分类(当然,把它重命名为客户端)。所有 Linq-To-Sql 类都作为部分类生成,因此您可以通过这种方式轻松扩展它们

喜欢这个:

public partial class Client
{
    public void GenerateInvoice()
    {
        // ... etc ...
    }
}
List<Client> clientList = MyDatabaseContext.Clients.ToList();
clientList[ someIndex ].SomeField = NewValue;
MyDatabaseContext.SubmitChanges();

我认为您真正想要的是一些扩展方法:

http://msdn.microsoft.com/en-us/library/bb383977.aspx

它们

看起来像是类的一部分,但您可以在不同的模块中实现它们。 正是你想要的。