C# NPOCO 轻量级O猎豹CS陆M框架(入门)

接轨翻译NPOCO wiki。

C# NPOCO 轻量级ORM框架(进阶),

再而三翻译NPOCO wiki。

这篇将home上 上边包车型客车多少个页面翻译。

wiki地址:

上一篇:

 

 

当前厂商采纳那一个框架,搜不到很详细的汉语资料。

那篇将home上 上面包车型客车多少个页面翻译。

从数据库映射到后天有指标

 

使用 SingleIntoSingleOrDefaultIntoFirstInto
FirstOrDefaultInto
方法,能够将数据库的列映射到存活对象。只有查询中的列将被安装在现存对象上。

1 public class User 
2 {
3     public int UserId { get;set; }
4     public string Email { get;set; }
5 }
6 
7 var user = new User() { UserId = 1 };
8 IDatabase db = new Database("connStringName");
9 db.SingleOrDefaultInto(user, "select Email from users where userid = @0", 1);

 

唯有英文wiki,所以翻译学习一下。

wiki地址:

壹对多的询问

 

这支援您映射三个与嵌套列表对象有局地多提到的查询。鉴于以下类:

 1     public class UserDto
 2     {
 3         public int UserId { get; set; }
 4         public string Name { get; set; }
 5         public List<CarDto> Cars { get; set; }
 6     }
 7 
 8     public class CarDto
 9     {
10         public string Make { get; set; }
11         public string Color { get; set; }
12     }

查询:

1 IDatabase db = new Database("connStringName");
2 
3 //v2
4 var users = db.FetchOneToMany<UserDto, CarDto>(x => x.UserId, 
5     "select u.*, c.* from Users u inner join Cars c on u.UserId = c.UserId order by u.UserId");
6 
7 //v3
8 var users = db.FetchOneToMany<UserDto>(x => x.Cars, 
9     "select u.*, c.* from Users u inner join Cars c on u.UserId = c.UserId order by u.UserId");

那将为您提供一个UserDto对象的列表,并且对于每一种对象,也将填充CarDto的列表。

注意:

因为博主也是低等次的,大概会有一点精通不完了的地方。

上一篇:

 

或是会有错误的地点,假诺有园友发现能够提议。

 

对嵌套对象映射

 

那将帮扶您将查询映射到有嵌套对象的靶子。鉴于以下类:

 1     public class User
 2     {
 3         public int UserId { get; set; }
 4         public string Name { get; set; }
 5         public Address Address { get; set; }
 6     }
 7 
 8     public class Address
 9     {
10         public string Street { get; set; }
11         public string City { get; set; }
12     }

查询:

1 IDatabase db = new Database("connStringName");
2 var users = db.Fetch<User, Address>("select u.UserId, u.Name, u.Street, u.City from Users");

那将给你一个运用嵌套类映射的 user 对象列表。

注意:

 

wiki地址:

 

字典和指标数组查询

 

临时,您不领悟查询再次回到的列。这正是能力所能达到映射到字典< string,object
>,或object[]的地方。字典和对象数组查询。

1 var users = db.Fetch<Dictionary<string, object>>("select * from users");
2 
3 or
4 
5 var users = db.Fetch<object[]>("select * from users");

注意:

从NPoco版本 > 一.0.3伊始,全部数组类型(值类型。string[]、int[]、double[]、DateTime[]等)将是三个立见效率的通用参数。

 

 

从数据库映射到现行反革命有对象

 

使用 SingleIntoSingleOrDefaultIntoFirstInto
FirstOrDefaultInto
方法,能够将数据库的列映射到现存对象。唯有查询中的列将被安装在存活对象上。

1 public class User 
2 {
3     public int UserId { get;set; }
4     public string Email { get;set; }
5 }
6 
7 var user = new User() { UserId = 1 };
8 IDatabase db = new Database("connStringName");
9 db.SingleOrDefaultInto(user, "select Email from users where userid = @0", 1);

 

盯住更动的换代

 

使用快照

快速照相用于追踪实体的改换,由此只有改动的性情才会被更新。在底下的言传身教中,唯有新
Name 将被发送到数据库,因为它的年龄值与开发银行快速照相时的值一样。

1 IDatabase db = new Database("connString");
2 var user = db.SingleById<User>(1);  // Name = "Ted", Age = 21
3 
4 var snapshot = db.StartSnapshot(user);  // 在此之后的任何更改都将被记录。
5 
6 user.Name = "Bobby";
7 user.Age = 21;
8 
9 db.Update(user, snapshot.UpdatedColumns());  // 只更新Name列

只有在UpdatedColumns()从前的变动将被含有在转移集中。

 

率先个查询:

一对多的询问

 

那支援你映射二个与嵌套列表对象有部分多涉及的询问。鉴于以下类:

 1     public class UserDto
 2     {
 3         public int UserId { get; set; }
 4         public string Name { get; set; }
 5         public List<CarDto> Cars { get; set; }
 6     }
 7 
 8     public class CarDto
 9     {
10         public string Make { get; set; }
11         public string Color { get; set; }
12     }

查询:

1 IDatabase db = new Database("connStringName");
2 
3 //v2
4 var users = db.FetchOneToMany<UserDto, CarDto>(x => x.UserId, 
5     "select u.*, c.* from Users u inner join Cars c on u.UserId = c.UserId order by u.UserId");
6 
7 //v3
8 var users = db.FetchOneToMany<UserDto>(x => x.Cars, 
9     "select u.*, c.* from Users u inner join Cars c on u.UserId = c.UserId order by u.UserId");

那将为你提供多个UserDto对象的列表,并且对于每一个对象,也将填充CarDto的列表。

注意:

  1. 此措施的首先个参数是 lambda
    表明式,该表明式标志第4个目的的惟1属性。
  2. 列的种种非常关键。它必须与概念的泛型参数的依次壹致。在那个示例中,查询内定了u。然后c *
    映射到< UserDto,CarDto >。
  3. 1经你要映射到用于插入数据的靶子,那么您须求分明你对 List<>使用了
    [Ignore]属性。
  4. 如果你正在使用3个外连接来实施查询,并且您预期之中的有的将不会被填充,请保管在
    FetchOneToMany调用中动用第一个lambda。这将赶回多数指标的重大品质。在上面包车型客车例子中,那大概是x
    = > x . carid。
  5. FetchOneToMany
    不可能用于获取嵌套的壹对多关系,也不可能用于三个1对多涉及。譬喻,假使UserDto也可以有多少个BoatsDto列表,那么唯有CarDto列表或BoatsDto列表能够加载并映射到五个查询。

复合主键

 

复合键能够钦点通过放置八个逗号之间的列名称 [PrimaryKey]属性。

1 [TableName("Users")]
2 [PrimaryKey("UserId,UserName")]
3 public class User
4 {
5     public int UserId { get; set; }
6     public string UserName { get;set; }
7 }

当设置了复合键,AutoIncrement属性总是私下认可false

倘诺您想行使 SingleById格局搜索3个对象,即可运用佚名类型。

1 IDatabase db = new Database("connStringName");
2 var user = db.SingleById<User>(new {UserId = 1, UserName = "user"});

 

 1 public class User 
 2 {
 3     public int UserId { get;set; }
 4     public string Email { get;set; }
 5 }
 6 
 7 using (IDatabase db = new Database("connStringName")) 
 8 {
 9     List<User> users = db.Fetch<User>("select userId, email from users");
10 }

对嵌套对象映射

 

那将帮扶你将查询映射到有嵌套对象的指标。鉴于以下类:

 1     public class User
 2     {
 3         public int UserId { get; set; }
 4         public string Name { get; set; }
 5         public Address Address { get; set; }
 6     }
 7 
 8     public class Address
 9     {
10         public string Street { get; set; }
11         public string City { get; set; }
12     }

查询:

1 IDatabase db = new Database("connStringName");
2 var users = db.Fetch<User, Address>("select u.UserId, u.Name, u.Street, u.City from Users");

这将给你多个应用嵌套类映射的 user 对象列表。

注意:

  1. 列的顺序极其重大。查询中的列供给依照钦点的泛型参数的相继点名。如。首先钦点用户列,然后钦赐地址列。
  2. 1经你要映射到用于插入数据的靶子,那么您必要确定保证使用
    [ResultColumn]
    属性忽略地址类。从v三中,您还要求加上[ComplexMapping]s属性。

 

三个结实集

 

该脾性使您能够在只调用3回数据库的景况下映射多个查询。

FetchMultiple 方法重临3个  Tuple < T >,List < T一 >
>。

1 IDatabase db = new Database("connStringName");
2 Tuple<List<User>, List<Address>> data = db.FetchMultiple<User, Address>("select * from users;select * from addresses;");
3 var users = data.Item1;
4 var addresses = data.Item2;

支持:

那仅支持能够回去七个结果集的数据库。在IData里德r上落到实处了NextResult()。通过Npgsql协助Sql
Server和Postgresql。

 

注: Database急需关闭连接(可以把它当作你的目的)。

字典和指标数组查询

 

有的时候,您不明了查询再次回到的列。那正是能力所能达到映射到字典< string,object
>,或object[]的位置。字典和对象数组查询。

1 var users = db.Fetch<Dictionary<string, object>>("select * from users");
2 
3 or
4 
5 var users = db.Fetch<object[]>("select * from users");

注意:

从NPoco版本 > 1.0.叁开始,全部数组类型(值类型。string[]、int[]、double[]、DateTime[]等)将是三个得力的通用参数。

 

明快的照射

 

对此3个类的映照,您能够选取 Map < T > 承继,当中 T 是要映射的类。

 1 public class UserMapping : Map<User>
 2 {
 3     public UserMapping()
 4     {
 5         PrimaryKey(x => x.UserId);
 6         TableName("Users");
 7         Columns(x =>
 8         {
 9             x.Column(y => y.Name).Ignore();
10             x.Column(y => y.Age).WithName("a_ge");
11         });        
12     }
13 }

辉映也足以从映射承接,并使用For < >方法在三次类中内定全体的照耀。

1 public class OurMappings : Mappings
2 {
3     public OurMappings()
4     {
5         For<User>().Columns( ....
6     }
7 }

 

数据库工厂设置:

 

你只必要成立映射二回,大家采纳数据库工厂来实现此操作。

1 public void Application_Start()
2 {
3     MyFactory.Setup();
4 }

 

 1 public static class MyFactory
 2 {
 3     public static DatabaseFactory DbFactory { get; set; }
 4 
 5     public static void Setup()
 6     {
 7         var fluentConfig = FluentMappingConfiguration.Configure(new OurMappings());
 8         //或单个的映射 
 9         //var fluentConfig = FluentMappingConfiguration.Configure(new UserMapping(), ....);
10 
11         DbFactory = DatabaseFactory.Config(x =>
12         {
13             x.UsingDatabase(() => new Database("connString"));
14             x.WithFluentConfig(fluentConfig);
15             x.WithMapper(new Mapper());
16         });
17     }
18 }

下一场你能够在你的代码中接纳它。

1 var database = MyFactory.DbFactory.GetDatabase();

假若您使用的是容器,那么你能够动用类似的东西

1 For<IDatabase>().Use(() => MyFactory.DbFactory.GetDatabase());

 

那是经过将列名映射的性质的名目User目的。相称不区分轻重缓急写。未有运用映射(查询)。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图