.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,即使在构造新对象时也是如此。

posted on 2024-04-23 23:05  是水饺不是水饺  阅读(27)  评论(0)    收藏  举报

导航