Ef Core花里胡哨系列(9) 陰影屬性,有用還是沒用?
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;
}
}

浙公網安備 33010602011771號