EntityFramework Core是否可以映射私有属性呢?了解一下。
前言
最近幾天身體有點(diǎn)抱恙,說(shuō)話都需要勇氣,痛哭。今天簡(jiǎn)短的寫一點(diǎn)探索性的內(nèi)容,僅供了解,感謝您的閱讀。
EF Core映射私有屬性
在EF 6.x系列中寫過(guò)一篇文章可以映射私有屬性,說(shuō)明EF的靈活性以及可擴(kuò)展性,那么問(wèn)題來(lái)了在EF Core是否同樣可以呢,我們來(lái)試試。
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設(shè)置私有屬性,接下來(lái)我們利用EF Core提供給我們的APi來(lái)訪問(wèn)是否可以進(jìn)行映射到數(shù)據(jù)庫(kù)表中呢?我們來(lái)嘗試一下。
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中如若我們需要訪問(wèn)元數(shù)據(jù),則需要借助于在映射配置中即如上builder中的Metadata屬性來(lái)訪問(wèn),比如訪問(wèn)屬性、主鍵、外鍵、導(dǎo)航屬性皆可,接下來(lái)我們遷移看看。
通過(guò)遷移生成的SQL語(yǔ)句我們就可得出結(jié)論:在EF Core中映射私有屬性和EF 6.x如出一轍,只不過(guò)使用方式略有不同罷了。
當(dāng)然實(shí)際場(chǎng)景中,若屬性為私有,那就沒(méi)有映射到數(shù)據(jù)庫(kù)中的必要了,這里只是作為探討。下面我們?cè)賮?lái)看看實(shí)際場(chǎng)景,比如上述中的Name屬性為計(jì)算屬性,那么此時(shí)我們會(huì)進(jìn)行如下映射:
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()");}}此時(shí)我們?cè)诳刂婆_(tái)進(jìn)行如下提交:
var context = new EFCoreDbContext();context.Add(new Blog(){IsDeleted = false,Status = 0,ModifiedTime = DateTime.Now,Url = "http://www.cnblogs.com/createmyself",Name = "2222"});var result = context.SaveChanges();因?yàn)槲覀儗⑸鲜鯪ame配置為計(jì)算屬性,但是此時(shí)Name屬性中的SET訪問(wèn)器是公共的,所以可能會(huì)有誤操作對(duì)其進(jìn)行賦值,當(dāng)然即使手動(dòng)賦值,最終依然能正確提交,結(jié)果不受任何影響,只能說(shuō)這樣可讀性不太好,既然Name為計(jì)算屬性即數(shù)據(jù)庫(kù)自動(dòng)為其賦了值,那么我們?yōu)楹尾粚ET訪問(wèn)器設(shè)置為私有的呢,保持其只讀而不可設(shè)置呢,改造如下即可:
public string Name { get; private set; }?如上設(shè)置Name為私有即不能手動(dòng)為其賦值,那么我們可以視為計(jì)算屬性或者傳參賦值,如下:
private Blog() { }public Blog(string name){Name = name;}在EF Core中利用構(gòu)造函數(shù)傳參,那么必須顯式存在無(wú)參構(gòu)造函數(shù),否則拋出異常,你懂的。再進(jìn)一步講,我們也可將Name屬性作為只作為字段來(lái)訪問(wèn),配置成如下即可。
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()");}總結(jié)
本節(jié)稍微探討了下EF Core中如何映射私有屬性,雖然沒(méi)有什么實(shí)際作用,可作為了解。想必很多時(shí)候,我們都會(huì)將屬性GET或者SET訪問(wèn)器都設(shè)置為公共的,雖然簡(jiǎn)便但可讀性并那么強(qiáng),是計(jì)算屬性、還是字段等等,都應(yīng)顯式設(shè)置,這樣可讀性會(huì)更好。
總結(jié)
以上是生活随笔為你收集整理的EntityFramework Core是否可以映射私有属性呢?了解一下。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: “汇新杯”新兴科技+互联网创新大赛青年创
- 下一篇: Java程序员从阿里、百度面试回来,这些