翼度科技»论坛 编程开发 .net 查看内容

Ef Core花里胡哨系列(9) 阴影属性,有用还是没用?

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
Ef Core花里胡哨系列(9) 阴影属性,有用还是没用?

Ef Core中提供了一些有趣的实现,例如阴影属性!虽然大部分时候我还没有遇到应用场景,但是不妨碍我们了解一下。
阴影属性是EF Core中的一个特性,它允许你在模型中定义一个属性,但是这个属性并不在对应的CLR类中。阴影属性只存在于EF Core的模型中,你可以在查询和保存数据时使用它,但是你不能直接在你的实体类中访问它。
阴影属性通常用于模型和数据库中存在但在实体类中不存在的字段。例如,你可能有一个"LastUpdated"的字段在数据库中,但你并不想在你的实体类中添加这个字段。在这种情况下,你可以使用阴影属性。
通常Json列我可能会用一下第二种BackingField来实现。
常见的阴影属性

以下是如何在EF Core中定义阴影属性的示例:
  1. public class SampleDbContext : IMigrationDbContext
  2. {
  3.     public SampleDbContext(DbContextOptions<SampleDbContext> options) : base(options)
  4.     {
  5.     }
  6.     protected override void OnModelCreating(ModelBuilder modelBuilder)
  7.     {
  8.         modelBuilder.Entity<Blog>()
  9.             .Property<DateTime>("LastUpdated");
  10.     }
  11. }
复制代码
在这个示例中,我们在Blog实体上定义了一个名为"LastUpdated"的阴影属性。这个属性只存在于EF Core的模型中,你不能在Blog类中访问它。
你可以在查询和保存数据时使用阴影属性。例如,你可以在保存数据前设置阴影属性的值:
  1. context.Entry(blog).Property("LastUpdated").CurrentValue = DateTime.Now;
复制代码
你也可以在查询时使用阴影属性:
  1. var blogs = context.Blogs
  2.     .OrderByDescending(b => EF.Property<DateTime>(b, "LastUpdated"))
  3.     .ToList();
复制代码
特殊的阴影属性BackingField

在EF Core中,BackingField是一种特殊的阴影属性,它用于在实体类内部表示一个字段,而这个字段不会被公开为公共属性。这种模式通常用于实现封装和业务逻辑。当然,通过[NotMapped]特性可以实现类似的效果。
以下是如何在EF Core中定义BackingField的示例:
  1. public class Blog
  2. {
  3.     private string _validatedUrl;
  4.     public int BlogId { get; set; }
  5.     [BackingField(nameof(_validatedUrl))]
  6.     public string Url
  7.     {
  8.         get { return _validatedUrl; }
  9.     }
  10.     public void SetUrl(string url)
  11.     {
  12.         // put your validation code here
  13.         _validatedUrl = url;
  14.     }
  15. }
复制代码
来源:https://www.cnblogs.com/donpangpang/Undeclared/17944677
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具