.net core EF 对私有字段的映射
支持字段 - EF Core | Microsoft Learn
PropertyAccessMode 枚举 (Microsoft.EntityFrameworkCore) | Microsoft Learn
基本配置
字段 和属性 命名约定
按照约定,将发现下列字段,作为给定属性的支持字段(按优先顺序列出)。
<camel-cased property name> url Url
_<camel-cased property name> _url Url
_<property name>_Url
m_<camel-cased property name> m_url Url
m_<property name> m_Url
注意这里 私有字段 是 _url 属性是 Url 按约定是 自动映射
public class Blog { private string _url; public int BlogId { get; set; } public string Url { get { return _url; } set { _url = value; } } }
在字段名称不符合上述约定等情况下,你也可通过使用数据注释或 Fluent API 来配置支持字段:
注意这里 属性是 Url 私有字段是 _validatedUrl 对应映射 modelBuilder.Entity<Blog>().Property(b => b.Url).HasField("_validatedUrl");
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; } }
Fluent API 映射
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Url)
.HasField("_validatedUrl");
}
仅限字段的属性
你还可以在模型中创建一个概念属性,该属性在实体类中不具有相应的 CLR 属性,而是使用字段来存储实体中的数据。 这不同于阴影属性,后者将数据存储在更改跟踪器中,而不是实体的 CLR 类型中。 当实体类使用方法而非属性来获取/设置值时,或者在域模型中根本不应该公开字段(例如主键)的情况下,通常使用仅限字段的属性。可通过在 Property(...)
API 中提供名称来配置仅限字段的属性:
上面这句话的啥意思就是 定义的私有字段 没有属性对应 但是 又需要 他存储数据
下面这个例子 私有字段 _validatedUrl 没有 对应的属性但是 又需要读取和保存数据到数据库
映射
modelBuilder.Entity<Blog>().Property("_validatedUrl");
internal class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property("_validatedUrl"); } } public class Blog { private string _validatedUrl; public int BlogId { get; set; } public string GetUrl() { return _validatedUrl; } public void SetUrl(string url) { using (var client = new HttpClient()) { var response = client.GetAsync(url).Result; response.EnsureSuccessStatusCode(); } _validatedUrl = url; } }
UsePropertyAccessMode(PropertyAccessMode)、
Field | 0 |
强制要求对 属性的所有访问都必须通过 字段。 |
FieldDuringConstruction | 1 |
强制要求在构造新实例时,对 属性的所有访问都必须通过 字段。 从数据库查询实体时,通常会构造新实例。 如果设置了此模式,并且无法写入字段,将引发异常。 |
PreferField | 3 |
对 属性的所有访问将直接访问 字段,除非字段未知,在这种情况下,访问将通过 属性。 |
PreferFieldDuringConstruction | 4 |
构造新实体实例时,对 属性的所有访问都会直接访问 字段,除非字段未知,在这种情况下,访问将通过 属性。 属性的所有其他用法都将通过属性 getter 和 setter,除非这不可行,例如, 属性是只读的,在这种情况下,这些访问也将使用 字段。 |
PreferProperty | 5 |
对属性的所有访问都会通过 属性,除非没有 属性或缺少 setter/getter,在这种情况下,访问将直接访问 字段。 |
Property | 2 |
强制要求对属性的所有访问都必须通过属性 getter 和 setter,即使在构造新对象时也是如此。 |