前言

最近几天身体有点抱恙,说话都需要勇气,痛哭。今天简短的写一点探索性的内容,仅供了解,感谢您的阅读。

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是否可以映射私有属性呢?了解一下。的更多相关文章

  1. EntityFramework Core 1.1+ Backing Fields(返回字段)

    前言 通过我发表的博文可知最近一段时间会将持续讲解EntityFramework Core特性,在此之前我提到过Backing Fields,回头翻了翻感觉写的还不够好,于是乎再来讲解一番,也是自己再 ...

  2. EntityFramework Core查询问题集锦(一)

    前言 和大家脱离了一段时间,有时候总想着时间挤挤总是会有的,但是并非人愿,后面会借助周末的时间来打理博客,如有问题可以在周末私信我或者加我QQ皆可,欢迎和大家一起探讨,本节我们来讨论EF Core中的 ...

  3. EntityFramework Core问题处理集锦(一)

    前言 和大家脱离了一段时间,有时候总想着时间挤挤总是会有的,但是并非人愿,后面会借助周末的时间来打理博客,如有问题可以在周末私信我或者加我QQ皆可,欢迎和大家一起探讨,本节我们来讨论EF Core中的 ...

  4. EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public?

    前言 不知我们是否思考过一个问题,在关系映射中对于导航属性的访问修饰符是否一定必须为public呢?如果从未想过这个问题,那么我们接下来来探讨这个问题. EF 6.x和EF Core 何种情况下必须配 ...

  5. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  6. EntityFramework Core 2.1重新梳理系列属性映射(一)

    前言 满血复活啦,大概有三个月的时间没更新博客了,关于EF Core最新进展这三个月也没怎么去看,不知现阶段有何变化没,本文将以EF Core 2.1稳定版本作为重新梳理系列,希望对看本文的你有所帮助 ...

  7. EntityFramework Core饥饿加载忽略导航属性问题

    前言 .NET Core项目利用EntityFramework Core作为数据访问层一直在进行中,一直没有过多的去关注背后生成的SQL语句,然后老大捞出日志文件一看,恩,有问题了,所以本文产生了,也 ...

  8. EntityFramework Core 自动绑定模型映射

    笔者最近在和同事共同开发项目时,需要从他们提供的包含数据库实体类型的类库中读取实体信息绑定到自己的项目中(但是都在同一个解决方案里),所以很直接的一种方式就是把项目中所有的实体都以 public Db ...

  9. EntityFramework Core指定更新导航属性了解一下?

    前言 本文来自和何镇汐大哥的探讨,很多时候我习惯于和别人交流过后会思考一些问题,无论是天马行空还是浅薄的想法都会记录下来,或许看到此博文的您能给我更多的思考,与人交流总能收获很多东西,出发点不一样则结 ...

随机推荐

  1. mpvue小程序开发之 集成第三方UI框架Vant Weapp UI

    集成进第三方的UI框架其实很简单 这里把vant-weapp的dist目录重命名为vant-weapp放在项目根目录的static文件夹下: 在src文件夹下,即我们写vue代码的位置,正在编写的页面 ...

  2. asp.net core导出导入excel

    使用NPOI导入导出excel,已经封装好Action可以直接调用 导出 效果图 使用方法 定义导出实体 class Student { public int Id { get; set; } pub ...

  3. 小白学习Python之路---开发环境的搭建

    本节内容 1.Python的介绍 2.发展史 3.安装Python 4.搭建开发环境 5.Hello World程序 一.Python的介绍 Python的创始人为荷兰人吉多·范罗苏姆(Guido v ...

  4. .NET Core微服务之基于EasyNetQ使用RabbitMQ消息队列

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.消息队列与RabbitMQ 1.1 消息队列 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...

  5. SpringBoot入门教程(十一)过滤器和拦截器

    在做web开发的时候,过滤器(Filter)和拦截器(Interceptor)很常见,通俗的讲,过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西:拦截器可以简单理解为“拒你所想拒”,关心你 ...

  6. vue-cli项目使用mock数据的方法(借助express)

    前言 现如今前后端分离开发越来越普遍,前端人员写好页面后可以自己模拟一些数据进行代码测试,这样就不必等后端接口,提高了我们开发效率.今天就来分析下前端常用的mock数据的方式是如何实现的. 主体 项目 ...

  7. [Javascript] encodeURIComponent()方法

    在vue項目中使用vue-router通过url进行传值 encodeURIComponent encodeURIComponent() 函数可把字符串作为 URI 组件进行编码.encodeURIC ...

  8. OpenXMl倒出word、PDF

    OpenXMl倒出word.PDF @using MarkdownSharp @{     ViewBag.Title = "预览";     Layout = "~/V ...

  9. iis正确安装了,但是还是无法访问,这是iis和.net安装顺序问题,记录一下

    正确顺序:先安装iis,后安装net 如果没有按照正常顺序进行安装的,可能就无法访问了,这就需要手动 注册asp.net 4.0 到iis ,可以使用此命令重新注册一下: 32位的Windows: 1 ...

  10. 查询拼接SQL语句,多条件模糊查询

    多条件查询,使用StringBuilder拼接SQL语句,效果如下: 当点击按钮时代码如下: private void button1_Click(object sender, EventArgs e ...