[LINQ2Dapper]最完整Dapper To Linq框架(三)---实体类关系映射

此特性需要安装Kogel.Dapper.Mssql或者Oracle 3.06及以上版本,实体类层需要安装Kogel.Dapper.Extension 3.06及以上版本

目录

 

1.实体类和数据库关系映射特性

1.[Identity]可以标识主键

  [Identity]
  public int id { get; set; }

Identity内还可以使用IsIncrease指定字符串是否是自增,来判断插入语句是否需要给该字段赋值 

    [Identity(IsIncrease =true)]  //默认为true,是自增
     public int Id { get; set; }

2.实体类名称和数据库表名不一致,或者属性名称和字段不一致

可以使用 [Display(Rename = "名称")] 特性标识

[Display(Rename = "users")]
    public class testusers 
    {
        [Display(Rename ="Content")]
        public string testName222 { get; set; }
    }

Rename填写数据库对应的表名或者字段名称,用来映射表关系

执行效果

或者直接使用

//或者直接使用ResetTableName,例如
conn.QuerySet<testusers>().ResetTableName(typeof(testusers), "users").Get();

(只会在当条语句生效)

 

 3.Display使用AsName区别同表之间的关系

假设同一条表达式语句中查询了两次A表,这时使用where条件 Where<A>可能无法指定到底是判断哪张A表,

这时就需要使用AsName

[Display(AsName ="commm1")]
    public class Comment:IBaseEntity<int>
    {
        [Identity(IsIncrease =true)]
        public int Id { get; set; }
    }
//继承同表,设置表名称
[Display(AsName = "commm2",Rename = "Comment")]
  public class Comment1 : Comment
    {

    }

现在表达式如果需要判断第二个A表的条件就可以直接使用

表达式.Where<Comment1>(条件)来判断了,匿名类型返回字段和连表查询时都可以用到来避免冲突。

 

4.非表映射关系

可以使用   [Display(IsField = false)] 特性标识

框架隐射时就会排除该字段

 

2.使用原生Dapper是否可以用Kogel.Dapper的特性标识

目前支持原生Dapper的特性只有[Display(Rename = "名称")]

不过用法有点差别,需要先执行FieldMatch<T>()方法

 然后实体类

 

 这个FieldMatch函数是注册全局的,所以只需要执行一次

然后查看效果,字段“test111”的值变成了Rename指向“Content”的值

 

3.实体类预加载

        在系统启动时可以使用 EntityCache.Register 注册实体类到内存中,后续表达式不会在重复反射实体类,减少反射时间,提升性能

 

此方法有三个重载

1.Register(Type type)

例如

EntityCache.Register(typeof("实体类"));

  

2.Register(Type []type)

可以通过反射获取实体类类型数组

3.Register(string assemblyString)

assemblyString:通过给定程序集的长格式名称加载程序集。

例如

EntityCache.Register("实体类层的类库名称");

  

完整Demo可以去Github上下载:

https://github.com/a935368322/Kogel.Dapper.Test

如有问题也可以加QQ群讨论:

技术群 710217654

框架开源,可以加群下载源码

posted @ 2019-06-24 16:40  Kogel  阅读(4583)  评论(1编辑  收藏  举报