EntityFramework Core是否可以映射私有属性呢?了解一下。
前言
最近几天身体有点抱恙,说话都需要勇气,痛哭。今天简短的写一点探索性的内容,仅供了解,感谢您的阅读。
EF Core映射私有属性
在EF 6.x系列中写过一篇文章可以映射私有属性,说明EF的灵活性以及可扩展性,那么问题来了在EF Core是否同样可以呢,我们来试试。
public class Blog
{
public int Id { get; set; }
private string Name { get; set; }
public string Url { get; set; }
public DateTime CreatedTime { get; set; }
public DateTime ModifiedTime { get; set; }
public byte Status { get; set; }
public bool IsDeleted { get; set; }
}
如上代码,我们将Name设置私有属性,接下来我们利用EF Core提供给我们的APi来访问是否可以进行映射到数据库表中呢?我们来尝试一下。
public class BlogConfiguration : IEntityTypeConfiguration<Blog>
{
public void Configure(EntityTypeBuilder<Blog> builder)
{
var nonPublicProperties = builder.Metadata.ClrType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var p in nonPublicProperties)
{
builder.Property(p.Name).HasColumnType("VARCHAR(50)");
}
builder.Property(p => p.CreatedTime).HasColumnType("DATETIME").HasDefaultValueSql("GETDATE()");
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new BlogConfiguration());
base.OnModelCreating(modelBuilder);
}
在EF Core中如若我们需要访问元数据,则需要借助于在映射配置中即如上builder中的Metadata属性来访问,比如访问属性、主键、外键、导航属性皆可,接下来我们迁移看看。

通过迁移生成的SQL语句我们就可得出结论:在EF Core中映射私有属性和EF 6.x如出一辙,只不过使用方式略有不同罢了。
当然实际场景中,若属性为私有,那就没有映射到数据库中的必要了,这里只是作为探讨。下面我们再来看看实际场景,比如上述中的Name属性为计算属性,那么此时我们会进行如下映射:
public class BlogConfiguration : IEntityTypeConfiguration<Blog>
{
public void Configure(EntityTypeBuilder<Blog> builder)
{
builder.Property(p => p.Name).IsRequired().HasComputedColumnSql("((N'cnblogs'+CONVERT([CHAR](8),[CreatedTime],(112)))+RIGHT(REPLICATE(N'0',(6))+CONVERT([NVARCHAR],[Id],(0)),(6)))");
builder.Property(p => p.CreatedTime).HasColumnType("DATETIME").HasDefaultValueSql("GETDATE()");
}
}
此时我们在控制台进行如下提交:
var context = new EFCoreDbContext();
context.Add(new Blog()
{
IsDeleted = false,
Status = ,
ModifiedTime = DateTime.Now,
Url = "http://www.cnblogs.com/createmyself",
Name = ""
});
var result = context.SaveChanges();
因为我们将上述Name配置为计算属性,但是此时Name属性中的SET访问器是公共的,所以可能会有误操作对其进行赋值,当然即使手动赋值,最终依然能正确提交,结果不受任何影响,只能说这样可读性不太好,既然Name为计算属性即数据库自动为其赋了值,那么我们为何不将SET访问器设置为私有的呢,保持其只读而不可设置呢,改造如下即可:
public string Name { get; private set; }
如上设置Name为私有即不能手动为其赋值,那么我们可以视为计算属性或者传参赋值,如下:
private Blog() { }
public Blog(string name)
{
Name = name;
}
在EF Core中利用构造函数传参,那么必须显式存在无参构造函数,否则抛出异常,你懂的。再进一步讲,我们也可将Name属性作为只作为字段来访问,配置成如下即可。
public void Configure(EntityTypeBuilder<Blog> builder)
{
var property = builder.Metadata.FindProperty(nameof(Blog.Name));
property.SetPropertyAccessMode(PropertyAccessMode.Field); builder.Property(p => p.Name).HasColumnType("VARCHAR(50)");
builder.Property(p => p.CreatedTime).HasColumnType("DATETIME").HasDefaultValueSql("GETDATE()");
}
总结
本节稍微探讨了下EF Core中如何映射私有属性,虽然没有什么实际作用,可作为了解。想必很多时候,我们都会将属性GET或者SET访问器都设置为公共的,虽然简便但可读性并那么强,是计算属性、还是字段等等,都应显式设置,这样可读性会更好。
EntityFramework Core是否可以映射私有属性呢?了解一下。的更多相关文章
- EntityFramework Core 1.1+ Backing Fields(返回字段)
前言 通过我发表的博文可知最近一段时间会将持续讲解EntityFramework Core特性,在此之前我提到过Backing Fields,回头翻了翻感觉写的还不够好,于是乎再来讲解一番,也是自己再 ...
- EntityFramework Core查询问题集锦(一)
前言 和大家脱离了一段时间,有时候总想着时间挤挤总是会有的,但是并非人愿,后面会借助周末的时间来打理博客,如有问题可以在周末私信我或者加我QQ皆可,欢迎和大家一起探讨,本节我们来讨论EF Core中的 ...
- EntityFramework Core问题处理集锦(一)
前言 和大家脱离了一段时间,有时候总想着时间挤挤总是会有的,但是并非人愿,后面会借助周末的时间来打理博客,如有问题可以在周末私信我或者加我QQ皆可,欢迎和大家一起探讨,本节我们来讨论EF Core中的 ...
- EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public?
前言 不知我们是否思考过一个问题,在关系映射中对于导航属性的访问修饰符是否一定必须为public呢?如果从未想过这个问题,那么我们接下来来探讨这个问题. EF 6.x和EF Core 何种情况下必须配 ...
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...
- EntityFramework Core 2.1重新梳理系列属性映射(一)
前言 满血复活啦,大概有三个月的时间没更新博客了,关于EF Core最新进展这三个月也没怎么去看,不知现阶段有何变化没,本文将以EF Core 2.1稳定版本作为重新梳理系列,希望对看本文的你有所帮助 ...
- EntityFramework Core饥饿加载忽略导航属性问题
前言 .NET Core项目利用EntityFramework Core作为数据访问层一直在进行中,一直没有过多的去关注背后生成的SQL语句,然后老大捞出日志文件一看,恩,有问题了,所以本文产生了,也 ...
- EntityFramework Core 自动绑定模型映射
笔者最近在和同事共同开发项目时,需要从他们提供的包含数据库实体类型的类库中读取实体信息绑定到自己的项目中(但是都在同一个解决方案里),所以很直接的一种方式就是把项目中所有的实体都以 public Db ...
- EntityFramework Core指定更新导航属性了解一下?
前言 本文来自和何镇汐大哥的探讨,很多时候我习惯于和别人交流过后会思考一些问题,无论是天马行空还是浅薄的想法都会记录下来,或许看到此博文的您能给我更多的思考,与人交流总能收获很多东西,出发点不一样则结 ...
随机推荐
- 基于HTTP协议的几种实时数据获取技术
原文链接https://www.cnblogs.com/xrq730/p/9280404.html,作者博客园----五月的仓颉,转载请注明出处,谢谢 HTTP协议 HTTP协议大家都很熟悉了,开始本 ...
- Use Wait & Notify to Implement Two Threads Run Alternatively
public class ThreadCommunication { public static void main(String[] args) { Business business = new ...
- C#类型(一)
1.System.Object C#的所有类型都是派生自System.Object 也就是说下面的两个类型定义完全一致 // 隐式派生自Object public class Person{ } { ...
- java调用python程序以及向python程序传递参数
在做项目的时候,经常会碰到这个问题,主要程序是用java写的,有些功能使用python写的,整个项目需要把java代码和python代码进行整合,在一个项目里面运行,这就涉及到java调用python ...
- 与其争论java和.net的差别,还不如多想点用编程技术挣钱的方式
年前和最近,我发现在博客园和其它地方,有不少争论java和.net哪个好的文章,其实这是种好现象.虽然到了架构层面,技术是通用的,但兼听则明,而且技多不压身,多种挣钱的方式总不会错. 本人最近主攻Ja ...
- AlertConfirmDialog【基于AlertDialog的确认取消对话框】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 确认取消对话框,基于AlertDialog.不是基于DialogFragment. 按钮文本可以根据实际情况更换. 效果图 代码分析 ...
- TabTopLayout【自定义顶部选项卡区域(固定宽度且居中)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 自定义顶部选项卡并居中显示.结合显示/隐藏view的方式实现切换功能(正常情况下可能是切换fragment). 效果图 代码分析 T ...
- 移动APP及游戏推广,有预算为什么还起不了量
本文转自公众号:caoz的梦呓,作者是互联网行业内资深人士,这里分享一篇他本人写的经验干货,希望能给大家带来点帮助. 在广告分析师群,起量是他们讨论最多的话题之一. 我们刚做游戏出海业务的时候,第一款 ...
- netstat命令总结
nestat介绍 netstat是一款命令行工具,可用于列出系统上所有的网络套接字连接情况,包括 tcp, udp 以及 unix 套接字,另外它还能列出处于监听状态(即等待接入请求)的套接字. 使用 ...
- 痞子衡嵌入式:恩智浦i.MXRT系列微控制器量产神器RT-Flash用户指南
RT Flash English | 中文 1 软件概览 1.1 介绍 RT-Flash是一个专为基于NXP i.MX RT系列芯片的产品量产而设计的工具,其功能与官方MfgTool2工具类似,但是解 ...