c# - 将 LINQ to SQL 数据实体子类化 - 坏主意还是遗漏了什么?

标签 c# linq-to-sql subclass

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

例如,如果我的数据库中有一个表 Client,我可以创建 ClientBO 扩展类 Client,并添加如下行为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();

最佳答案

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

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

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

像这样:

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

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

clientList[ someIndex ].SomeField = NewValue;
MyDatabaseContext.SubmitChanges();

关于c# - 将 LINQ to SQL 数据实体子类化 - 坏主意还是遗漏了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6036254/

相关文章:

python - 如何在子类中使用 "hide"父类(super class)方法

c# - 如何从控制台应用程序启动 kdiff?

swift - 无法覆盖泛型类的子类中的初始化程序

c# - 计时器落后

c# - 在 Linq2SQL 中不先加载就删除实体

c# - 对象有关系时使用LINQ to SQL添加记录有什么秘诀吗?

sql-server - T-SQL IsNumeric() 和 Linq-to-SQL

json - 使用 ObjectMapper 的不同类型 JSON 文件

c# - 如何将此对象保存到文件中?

c# - 膨胀通用/模板化自定义 View