惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
云风的 BLOG
云风的 BLOG
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
GbyAI
GbyAI
C
Check Point Blog
M
MIT News - Artificial intelligence
T
The Blog of Author Tim Ferriss
Jina AI
Jina AI
博客园 - 【当耐特】
U
Unit 42
月光博客
月光博客
腾讯CDC
Y
Y Combinator Blog
小众软件
小众软件
博客园_首页
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
The GitHub Blog
The GitHub Blog
博客园 - 聂微东
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
T
Tailwind CSS Blog

博客园 - 风云

Vane.Dispatch 1.0.0 发布:一个与容器、传输层零耦合的 .NET 服务分发引擎 MiniLog 1.0 GA 发布:零分配、零依赖的 .NET 高性能日志框架 从实战到生产:Acl.Excel 八大场景与避坑指南(终篇) 写入分配砍掉 63%:Acl.Excel 绕过 XmlWriter 字节直写 零依赖纯 C# DEFLATE 引擎:2916 行移植 libdeflate 一个 42KB 的 Excel 如何撑爆 4.5PB?Acl.Excel 8 层防御 Acl.Excel 跨库基准:读取最高快 32.8 倍 24B消灭上亿次装箱:Acl.Excel零装箱设计 百万行Excel如何恒定内存?Acl.Excel流式拆解 不依赖 NPOI/ClosedXML,纯 C# Excel 库如何做到 30 倍性能? 2-30 倍性能:Acl.Excel 设计哲学与零依赖 Acl.Excel vs MiniExcel 1.45.0:百万行读写实测,托管内存低至 1/37,QueryFirst 平分秋色 优化纯 C# DEFLATE 压缩器:从 0 到超越 .NET 内置的完整历程 从零实现 DEFLATE 压缩器:纯 C# 移植版如何在 Excel 场景超越 .NET 内置? Docker下构建centos7容器无法使用systemctl命令的解决办法 重新诠释的OSGi规范 让我们的领域逻辑彻底裸奔吧 NLite.Web 组件更新日志 Ndf 组件更新日志 新年首作-ELinq+T4模版引擎制作多文件实体代码生成器 ORM组件 ELinq (四)-映射配置之FluentAPI ORM组件 ELinq (三)-映射配置之Attribute NLite 更新日志 ORM组件 ELinq 更新日志 ORM组件 ELinq (二) 映射配置之Table 用户中心 - 博客园 ORM组件 ELinq 系列 国内开源ORM组件 ELinq正式版发布 ORM组件 ELinq (一)首航之旅 年度开源力作-ORM组件 ELinq诞生了
ORM组件 ELinq (五)-映射配置之XML
风云 · 2013-01-02 · via 博客园 - 风云

ORM组件 ELinq (五) -映射配置之XML

上节介绍了基于FluentAPI的映射配置方式,本节我们将亲自动手,一步一步搭建ELinq的XML映射程序来。备注我使用的开发环境:VS2010,Nuget 包管理器,SqlCe3.5

1.获取ELinq

从Nuget 控制台下载安装ELinq:install-package ELinq,安装成功后,VS的项目就自动引用了ELinq.dll,并且自动添加了ELinq.xsd (xml mapping 的Schema 文件)、Northwind.cs和Northwind.Mapping.xml 等Demo文件,由于第一次使用,所以把Northwind.cs和Northwind.Mapping.xml这两个文件先删掉。

2. 建数据库

 打开SqlCe3.5 数据库,建立客户表:Customer ,过程略

3. 创建和设计持久化类

3-1创建和设计持久化类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace XMLMappingDemo.PO
{
    public class Customer
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

3-2 编写XML映射文件  

提示:要为ELinq的XML映射配置添加智能提示功能,需要把ELinq.xsd 文件复制到X:\Program Files\Microsoft Visual Studio 10.0\Xml\Schemas目录即可

ELinq.Xsd 定义了Mapping、Table、Id、Column、ComputedColumn、Association、Version等映射元素

创建Customer.Mapping.xml,并输入如下内容

4. 创建和设计DbContext

4-1 创建DbConfiguration

 注意:需要设置Customer.mapping.xml 文件的"Build Action"属性为:null,"Copy To Output Directory"属性为:Always

4-2 创建DbContext

    class DemoContext:DbContext
    {
        static DbConfiguration configuration = DbConfiguration.ConfigureSqlCe35("Db.sdf")
            .SetSqlLogger(() => new SqlLog(Console.Out))
            .AddFile(@"Mappings\Customer.mapping.xml")
            ;

        public DemoContext() : base(configuration) { }

        public IDbSet<Customer> Customers { get; set; }
    }

5. 测试

5.1 清空记录

在进行测试前,先删除所有记录,并检查表中的记录一定为0

        [Test]
        public void ClearAll()
        {
            using (var db = new DemoContext())
            {
                db.Customers.Delete(p => true);
                Assert.AreEqual(0, db.Customers.Count());
            }
        }

下面是输出的SQL语句

DELETE FROM [Customer]
WHERE  1=1 

SELECT COUNT(*)
FROM [Customer] AS t0

5-2 添加记录

添加一条记录,并检查客户Id已经自动返回

//插入
var customer = new Customer { FirstName = "风云", LastName = "" };
Assert.AreEqual(0, customer.Id);
db.Customers.Insert(customer);
Assert.IsTrue(customer.Id > 0);

SQL输出

INSERT INTO [Customer]([FirstName], [LastName])
VALUES (@p0, @p1)
-- p0:(DbType = String,Value = 风云)
-- p1:(DbType = String,Value = 王)

SELECT @@IDENTITY AS [Id]

 5-3 查询记录

为了确保上一步已经插入到数据库中,这一步做一个查询检查,把查询结果转换成DataTable并输出数据

                //查询
                var items = from c in db.Customers
                            where c.FirstName == "风云"
                            select c;

                var tb = Mapper.Map<IQueryable<Customer>, DataTable>(items);

                tb.WriteXml(Console.Out);

 SQL输出

SELECT t0.[Id], t0.[FirstName], t0.[LastName]
FROM [Customer] AS t0
WHERE (t0.[FirstName] = @p0)
-- p0:(DbType = String,Value = 风云)

<DocumentElement>
  <Customer>
    <Id>9</Id>
    <FirstName>风云</FirstName>
    <LastName></LastName>
  </Customer>
</DocumentElement>

5-4 更新记录

customer.LastName = "dd";
var effectedRow = db.Customers.Update(customer);
 Assert.AreEqual(1, effectedRow);

SQL输出

UPDATE [Customer]
SET [FirstName] = @p0, [LastName] = @p1
WHERE (([Id]=9))
-- p0:(DbType = String,Value = 风云)
-- p1:(DbType = String,Value = dd)
5-5 查询记录

为了确保上一步已经更新到数据库中,这一步做一个查询检查,把查询结果转换成DataTable并输出数据

//查询
items = from c in db.Customers
        where c.FirstName == "风云"
        select c;

 tb = Mapper.Map<IQueryable<Customer>, DataTable>(items);

 tb.WriteXml(Console.Out);

 SQL输出

SELECT t0.[Id], t0.[FirstName], t0.[LastName]
FROM [Customer] AS t0
WHERE (t0.[FirstName] = @p0)
-- p0:(DbType = String,Value = 风云)

<DocumentElement>
  <Customer>
    <Id>9</Id>
    <FirstName>风云</FirstName>
    <LastName>dd</LastName>
  </Customer>
</DocumentElement>

5-6 删除记录

db.Customers.Delete(p => p.Id == customer.Id);
Assert.AreEqual(0, db.Customers.Count());

SQL输出

DELETE FROM [Customer]
WHERE (([Id]=9))

SELECT COUNT(*)
FROM [Customer] AS t0

结语

在这篇文章中,我们使用ELinq来构建了一个最基本的项目,没有体现ELinq更多细节,只描绘了ELinq的Xml映射的以及单表的CRUD操作。当然使用ELinq有各种各样的程序架构,本系列未做处理,更多实战知识以后介绍,下一节将介绍基于约定的方式进行映射配置。

技术支持:

  1. 官方网站
  2. Nuge 下载页面
  3. ORM组件 ELinq系列
  4. ORM组件 ELinq 更新日志
  5. ORM组件 ELinq 使用答疑
  6. 在我的博客留言,我会尽可能地抽时间来答复大家的问题。
  7. 加入 ELinq用户的 QQ群(271342583)。

   谢谢大家的阅读,麻烦大伙点一下推荐,再次谢谢大家。 ^_^