C# Linq定义关系数据库到entity class 的映射

在LINQ2SQL中,所有的数据操作的入口都是DataContext对象,如下面的代码示例了访问Northwnd数据库的Customer数据: 

 

更完整的通过DataContext实现SqlServer数据库的CRUD操作的方法,请参考LINQ那些事儿(2)- 简单对象的CRUD操作和Association的级联操作。 CreateContext()函数通过传递数据库mdf文件的路径和映射信息,构造了一个DataContext对象,通过DataContext对象,我们可以对该数据库进行任何的操作,包括CRUD,甚至是删除或创建一个新的数据库文件。为了便于示例,本文用了Sqlexpress的本地数据库文件,你可以修改connectionString指向正式SqlSever上的数据库。

  关于DataContext的详细说明,请参考MSDN:http://msdn.microsoft.com/zh-cn/library/system.data.linq.datacontext.aspx

  我们来关注传递给DataContext构造函数的第二个参数——mapping,mapping对象中包含了Northwnd数据库和实体类之间的映射关系。LINQ2SQL通过System.Data.Linq.Mapping.MappingSource来作为映射关系的基类,并且在.Net Framework 3.5中提供了AttributeMappingSource和XmlMappingSource,分别表示了两种定义映射关系的方法——通过在实体类上用Attribute标签来定义,以及通过外部Xml文件来定义映射关系。

  当使用一些开源的ORM框架时,你可能不得不手写定义这些映射信息,或者通过第三方的工具来实现映射信息的生成。对于LINQ2SQL,同样可以用手写定义,但是微软已经为我们提供了足够好的生成工具——O/R Designer和SqlMetal。

  参考资料:

  基于属性的映射http://msdn.microsoft.com/zh-cn/library/bb386971.aspx

  使用O/R Designer生成对象模型 http://msdn.microsoft.com/zh-cn/library/bb384429.aspx

  使用SqlMetal.exe生成对象模型http://msdn.microsoft.com/zh-cn/library/bb386987.aspx

 

通过O/R Desginer或SqlMetal,你不但可以生成实体类的定义,而且还生成了一个DataContext的派生类,名称为 xxxDataContext(xxx为默认数据库的名称,也可以自行定义)。在文章开始的代码中,我们通过 DataContext.GetTable<Customer>()来获取操作Customer表的表对象,但在 xxxDataContext类中提供了更方便的方法,通过访问xxxDataContext类中包含的Customers属性即可。

  需要注意的是,在SqlServer中你允许设计一张没有主键标识(Primary key)的数据表,但是在定义entity class的属性时,必须至少包含一个的主键属性(IsPrimaryKey=true)。这不单是数据库设计标准的要求,DataContext对象会使用PrimaryKey属性值作为实体对象的唯一标识,用来进行实体对象的生命周期管理,详见LINQ那些事(6)。

  我不建议你使用手写的方法来定义entity class,甚至是必须用O/R Designer或Sqlmetal来生成entity class,因为对于包含关联关系(Association)的entity class,自动生成的代码中还包含了维护Association的代码,这对LINQ2SQL实现级联操作是非常关键的(你可以看看生成的 Customer类的代码,它如何维护Orders属性)。

  还有一个问题是通过Attribute标签和Xml映射文件来定义映射关系,孰优孰劣的问题,这已经是一个老问题了。听到最多的是,有人说大项目用 XML方式,小项目用Attribute方式,我觉得那纯粹是瞎扯淡,但XML方式的确有一个好处就是有时当数据库发生更改时,我们直接修改XML就可以了,而无需重新编译代码,其他的更多就是习惯问题了。在这一系列的文章中,我都采用了XML的方式来定义,文章开始的代码示例了如何由XML来创建 DataContext对象,你只需把DataContext改成xxxDataContext即可。

 

  顺便提供几个非常常用的sqlmetal参数组合:(拷贝时注意去掉northwnd.和cs之间的断行)

  * 1、生成本地数据库文件的映射:sqlmetal "northwnd.mdf" /code:northwnd.

  cs /map:northwnd.xml /namespace:LinqAttach /context:Northwnd /pluralize

  * 2、通过链接字符串:sqlmetal /conn:”server=myserver; database=northwind” /code:northwnd.

  cs /map:northwnd.xml /namespace:LinqAttach /context:Northwnd /pluralize

  * 3、通过指定数据源:sqlmetal /server:myserver /database:northwnd /password:pwd /code:northwnd.

  cs /map:northwnd.xml /namespace:LinqAttach /context:Northwnd /pluralize

  说明:

  /code:指定包含生成实体类和派生DataContext类的cs代码的文件路径

  /map:指定生成xml映射文件路径

  /namespace:指定生成的cs代码所在的命名空间

  /context:指定生成的派生DataContext类的类名

  /pluralize:指定sqlmetal根据英文单/复数规则来生成实体类和属性的名称,非常靠谱。

 

比如:打开VS 2008的命令窗口,输入以下内容:

sqlmetal /database:cargemax_business /server:localhost /language:csharp /user:sa /password:123456 /code:C:/cargoLinq.cs

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C#中将实体映射到SQLite数据库,可以使用ORM(对象关系映射)框架,比如EF Core和Dapper等。以下是使用EF Core的一个简单示例: 1. 首先,需要安装EF Core和SQLite包。可以使用NuGet包管理器或手动下载并添加到项目中。 2. 创建SQLite数据库文件并打开它。可以使用SQLite Studio或其他SQLite客户端。 3. 创建一个实体类,例如: ```csharp public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } ``` 4. 创建DbContext类,指定连接字符串和实体类: ```csharp using Microsoft.EntityFrameworkCore; public class MyDbContext : DbContext { public DbSet<Person> People { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("Data Source=database.db"); } } ``` 5. 在C#代码中,使用DbContext连接到SQLite数据库,并将实体映射数据库表。以下是一个示例代码: ```csharp using System.Linq; //连接到SQLite数据库 using (var db = new MyDbContext()) { //创建Person表 db.Database.EnsureCreated(); //插入新记录 var person = new Person { Name = "John Doe", Age = 30 }; db.People.Add(person); db.SaveChanges(); //查询记录 var people = db.People.ToList(); //输出结果 foreach (var p in people) { Console.WriteLine($"Id: {p.Id}, Name: {p.Name}, Age: {p.Age}"); } } ``` 这样,就可以将实体映射到SQLite数据库中,可以方便地进行CRUD操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值