Ef Core花里胡哨系列(9) 阴影属性,有用还是没用?
1.Ef Core花里胡哨系列(2) 移除外键、扩展操作2.Ef Core花里胡哨系列(1) SafeDelete、ReadOnly、Audit 安全删除、只读、审计等3.Ef Core花里胡哨系列(3) 动态修改实体对应的表(分表)、多租户4.Ef Core花里胡哨系列(4) 多租户5.Ef Core花里胡哨系列(5) 动态修改追踪的实体、动态查询6.Ef Core花里胡哨系列(6) XML注释同步到数据库注释7.Ef Core花里胡哨系列(7) 使用Ef Core也能维护表架构?8.Ef Core花里胡哨系列(8) 如何可控管理Ef Core的迁移?
9.Ef Core花里胡哨系列(9) 阴影属性,有用还是没用?
10.Ef Core花里胡哨系列(10) 动态起来的 DbContext11.Ef Core花里胡哨系列(11) ef8 无实体查询,你好!Ef Core花里胡哨系列(9) 阴影属性,有用还是没用?
Ef Core
中提供了一些有趣的实现,例如阴影属性!虽然大部分时候我还没有遇到应用场景,但是不妨碍我们了解一下。
阴影属性是EF Core中的一个特性,它允许你在模型中定义一个属性,但是这个属性并不在对应的CLR类中。阴影属性只存在于EF Core的模型中,你可以在查询和保存数据时使用它,但是你不能直接在你的实体类中访问它。
阴影属性通常用于模型和数据库中存在但在实体类中不存在的字段。例如,你可能有一个"LastUpdated"的字段在数据库中,但你并不想在你的实体类中添加这个字段。在这种情况下,你可以使用阴影属性。
通常
Json
列我可能会用一下第二种BackingField
来实现。
常见的阴影属性
以下是如何在EF Core中定义阴影属性的示例:
public class SampleDbContext : IMigrationDbContext
{
public SampleDbContext(DbContextOptions<SampleDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property<DateTime>("LastUpdated");
}
}
在这个示例中,我们在Blog实体上定义了一个名为"LastUpdated"的阴影属性。这个属性只存在于EF Core的模型中,你不能在Blog类中访问它。
你可以在查询和保存数据时使用阴影属性。例如,你可以在保存数据前设置阴影属性的值:
context.Entry(blog).Property("LastUpdated").CurrentValue = DateTime.Now;
你也可以在查询时使用阴影属性:
var blogs = context.Blogs
.OrderByDescending(b => EF.Property<DateTime>(b, "LastUpdated"))
.ToList();
特殊的阴影属性BackingField
在EF Core中,BackingField是一种特殊的阴影属性,它用于在实体类内部表示一个字段,而这个字段不会被公开为公共属性。这种模式通常用于实现封装和业务逻辑。当然,通过[NotMapped]
特性可以实现类似的效果。
以下是如何在EF Core中定义BackingField的示例:
public class Blog
{
private string _validatedUrl;
public int BlogId { get; set; }
[BackingField(nameof(_validatedUrl))]
public string Url
{
get { return _validatedUrl; }
}
public void SetUrl(string url)
{
// put your validation code here
_validatedUrl = url;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?