FreeSql (三十五)CodeFirst 自定义特性

摘要:
比如项目内已经使用了其它orm,如efcore,这样意味着实体中可能存在[Key],但它与FreeSql[Column(IsPrimary=true]不同。FreeSql提供AOP自定义特性功能,实现与多个orm共同拥有一套实体特性,可避免重复定义特性。以下的示例代码,FreeSql使用EFCore的实体特性。

比如项目内已经使用了其它 orm,如 efcore,这样意味着实体中可能存在 [Key],但它与 FreeSql [Column(IsPrimary = true] 不同。

Q: FreeSql 实体特性为啥这么别扭?

A: 为了考虑一致性用法,全部封装在 ColumnAttribute 下,这样用户使用起来,不用到处 using 或者 回忆特性应该用哪个名字,如自增 [Column(IsIdentity = true)] 即可。

FreeSql 提供 AOP 自定义特性功能,实现与多个 orm 共同拥有一套实体特性,可避免重复定义特性。

以下的示例代码,FreeSql 使用 EFCore 的实体特性。

fsql.CodeFirst.ConfigEntity<ModelAopConfigEntity>(a => a.Property(b => b.pkid).IsPrimary(true));

fsql.Aop.ConfigEntity = (s, e) => {
  var attr = e.EntityType.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.Schema.TableAttribute), false).FirstOrDefault() as System.ComponentModel.DataAnnotations.Schema.TableAttribute;
  if (attr != null)
    e.ModifyResult.Name = attr.Name;
};
fsql.Aop.ConfigEntityProperty = (s, e) => {
  if (e.Property.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.KeyAttribute), false).Any())
    e.ModifyResult.IsPrimary = true;
};

[System.ComponentModel.DataAnnotations.Schema.Table("xxx")]
class ModelAopConfigEntity {
  [System.ComponentModel.DataAnnotations.Key]
  [Column(IsPrimary = false)]
  public int pkid { get; set; }
}

就这样,FreeSql 的实体特性就可以和 EFCore 那样设定了。其他自增、乐观锁等,依葫芦画瓢便是。

优先级

数据库特性 > 实体特性 > FluantApi(配置特性) > Aop(配置特性)

系列文章导航

免责声明:文章转载自《FreeSql (三十五)CodeFirst 自定义特性》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于selenium2(webdriver)自动化测试过程中标签页面或者窗口切换的处理解决方案修改chrome插件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

axios 学习文档

Axios是一个基于承诺的HTTP库,可以在浏览器和node.js中使用。执行POST请求axis.POST.then。接住执行多个并发请求函数getUserAccount(){returnaxios.get;}函数getUserPermissions(){returnaxios.get;}全部承诺。然后axios API可以通过传递相关配置来请求axios...

dBFs和dBm

dBFs和dBmdBFs是用来表征数字域功率值的大小,一般情况下我们定义0dBFs为数字域满刻度功率值,即数字域中功率的最大值;因此看到的dBFs的值都是负的。...

nginx做本地目录映射

nginx做本地目录映射有时候需要访问服务器上的一些静态资源,比如挂载其他设备上的图片到本地的目录,而本地的目录不在nginx根目录下,这个时候就需要简单的做一下目录映射来解决,比如想通过浏览器http://ip/image/2016/04/29/10/abc.jpg访问到系统目录/image_data/2016/04/29/10/abc.jpg需要在ngi...

Google Drive 里的文件下载的方法

Google Drive不提供创建直接下载链接的选项,但您可以通过更改链接形式在本地保存共享内容。例如,通过Google Drive共享的文件链接是:https://drive.google.com/file/d/FILE_ID/edit?usp=sharing如果您将其更改为以下修改版本,然后通过浏览器打开,则将直接下载该文件:https://drive....

R的卸载和更新安装

R包经常遇到不同版本的不兼容性。例如,与软件包相比,当前版本无论是新的还是旧的都很麻烦。最麻烦的是如何升级R软件?包括以下方法:方法1:(1)直接安装新版本(2)将旧版本库中的文件夹复制到新版本库文件夹并粘贴。如果中间有重复的名称,则不会被覆盖(需要更新基本包)。(3) 打开新版本的R并输入:update。程序包()以静默等待更新...

WebSocket 详解教程

WebSocket是一种网络通信协议。由于WebSockets连接存在很长时间,它与典型的HTTP连接不同,对服务器有重要影响。WebSocket事件以下是WebSocket对象的相关事件。其中,Tomcat 7、Jetty 7及以上版本开始支持WebSocket。此外,Spring框架还提供对WebSocket的支持。尽管如此,上述应用程序有自己的WebS...