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

13 篇文章 0 订阅
11 篇文章 0 订阅

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胖纸不争

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值