C# 将LINQ子类化为SQL数据实体-主意不好或缺少什么?

C# 将LINQ子类化为SQL数据实体-主意不好或缺少什么?,c#,linq-to-sql,subclass,C#,Linq To Sql,Subclass,我希望能够将自动生成的LINQ子类化为SQL数据类,并保存对所述对象的更改 例如,如果我的数据库中有一个表Client,我可以创建扩展类Client的ClientBO,并添加类似GenerateInvoice()之类的行为。在我想更新子类中的值或插入新记录之前,一切都正常。这样的变化(可以预见?)被抛弃了。我是否遗漏了什么,或者我首先创建了这些子类,这违反了LINQtoSQL或OO原则 以下是我的代码的简化示例: public class ClientBO : Client { publ

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

例如,如果我的数据库中有一个表
Client
,我可以创建扩展类
Client
ClientBO
,并添加类似
GenerateInvoice()
之类的行为。在我想更新子类中的值或插入新记录之前,一切都正常。这样的变化(可以预见?)被抛弃了。我是否遗漏了什么,或者我首先创建了这些子类,这违反了LINQtoSQL或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();
公共类ClientBO:Client
{
publicclientbo(客户端源代码):base()
{
FirstName=source.FirstName;
Lastname=source.Lastname;
//……等等。。。
}
}
列表客户端列表=
(从DatabaseContext中的客户端。客户端选择new ClientBO(客户端)).ToList();
clientList[someIndex].SomeField=NewValue;
MyDatabaseContext.SubmitChanges();

问题在于,您正在更改的对象不再是从数据存储中获取的相同对象

DataContext跟踪它所附加的所有对象的更改。但由于您从未更改所引用的“源”对象,因此数据上下文从未收到更改通知

我建议您将
ClientBO
改为
Client
的部分类(当然,将其重命名为Client)。所有Linq到Sql类都是作为部分生成的,因此您可以通过这种方式轻松地对它们进行扩展

像这样:

public partial class Client
{
    public void GenerateInvoice()
    {
        // ... etc ...
    }
}

List<Client> clientList = MyDatabaseContext.Clients.ToList();

clientList[ someIndex ].SomeField = NewValue;
MyDatabaseContext.SubmitChanges();
公共部分类客户端
{
公共无效生成文件()
{
//……等等。。。
}
}
List clientList=MyDatabaseContext.Clients.ToList();
clientList[someIndex].SomeField=NewValue;
MyDatabaseContext.SubmitChanges();

问题在于,您正在更改的对象不再是从数据存储中获取的相同对象

DataContext跟踪它所附加的所有对象的更改。但由于您从未更改所引用的“源”对象,因此数据上下文从未收到更改通知

我建议您将
ClientBO
改为
Client
的部分类(当然,将其重命名为Client)。所有Linq到Sql类都是作为部分生成的,因此您可以通过这种方式轻松地对它们进行扩展

像这样:

public partial class Client
{
    public void GenerateInvoice()
    {
        // ... etc ...
    }
}

List<Client> clientList = MyDatabaseContext.Clients.ToList();

clientList[ someIndex ].SomeField = NewValue;
MyDatabaseContext.SubmitChanges();
公共部分类客户端
{
公共无效生成文件()
{
//……等等。。。
}
}
List clientList=MyDatabaseContext.Clients.ToList();
clientList[someIndex].SomeField=NewValue;
MyDatabaseContext.SubmitChanges();

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


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

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


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

+1你的和霍根的方法都是很好的方法,我应该首先考虑。我选择你的,因为它对我现有的基础设施的改动最少。您可能想重新考虑将“GenerateInvoice”添加到客户机类:)但这不是重点here@Pleun-GenerateInvoice()是一个抽象的例子,而且是一个公认的可怕的例子。+1你的和霍根的方法都是很好的方法,我应该首先考虑。我选择你的,因为它对我现有的基础设施的改动最少。您可能想重新考虑将“GenerateInvoice”添加到客户机类:)但这不是重点here@Pleun-GenerateInvoice()是一个抽象的例子,在这方面是一个公认的可怕的例子。Oskar对我现有的基础设施进行的改动更少。然而,我应该首先考虑这一点。+1你的和奥斯卡的都是合适的。Oskar对我现有的基础设施进行的改动更少。然而,我应该首先考虑这一点。