同一张表对应多个 DBML 类

在 LINQ to SQL 中,DBML 设计器会为每张表生成一个实体类。当数据库表结构发生变化(比如新增了 bz 备注字段),但现有代码使用的 DBML 类不想改动时,可以为同一张表新建第二个 DBML 类,两个类映射到同一张物理表,字段集合不同。


操作方式

  1. 在 DBML 设计器中新建一个实体类(如 Money1
  2. 将其 Table 特性映射到同一张表 [dbo].[Money]
  3. 只添加需要的字段(如 namebz),不需要的字段不映射
// 旧代码不受影响,继续使用原来的 Money 类
using (var db = new DataClasses1DataContext())
{
    var q = from m in db.Money
            group m by new { m.name, m.bh } into g
            select new
            {
                g.Key.name,
                g.Key.bh,
                je = g.Sum(r => r.je),
                ssje = g.Sum(r => r.lx == 1 ? r.je : 0),
                tfje = g.Sum(r => r.lx == 2 ? r.je : 0),
                ylje = g.Sum(r => r.lx == 1 ? r.je : 0) - g.Sum(r => r.lx == 2 ? r.je : 0)
            };

    var list = q.ToList();

    // 新需求:需要用到 bz 字段,使用 Money1 类
    var q1 = from m in db.Money1
             select new { m.name, m.bz };

    var list2 = q1.ToList();
}Code language: JavaScript (javascript)

原理

项目说明
映射机制LINQ to SQL 通过 [Table(Name="dbo.Money")] 特性绑定实体类与物理表
字段匹配只映射类中声明的属性,表中多余的字段被忽略
查询生成SELECT 只查映射的字段,不查未声明的列
互不影响两个类独立存在,修改一个不影响另一个

生成的 SQL 对比

Money 类(无 bz):

SELECT [t0].[name], [t0].[bh], SUM([t0].[je]) AS [value], ...
FROM [dbo].[Money] AS [t0]
GROUP BY [t0].[name], [t0].[bh]Code language: CSS (css)

Money1 类(有 bz):

SELECT [t0].[name], [t0].[bz]
FROM [dbo].[Money] AS [t0]Code language: CSS (css)

同一个物理表,不同实体类生成不同的 SELECT 列。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注