基于.NET Core的EF框架私有字段映射配置
在使用Entity Framework Core进行数据库操作时,字段与属性之间的映射规则需要特别注意。本文将介绍如何配置私有字段的映射关系。
字段与属性的命名约定 按照约定,EF Core会根据以下优先顺序自动发现支持字段:
<camel-cased property name>例如Url对应的字段可能是_url_<camel-cased property name>例如_url<property name>_Url例如UrlUrlm_<camel-cased property name>例如m_urlm_<property name>例如m_Url
需要注意的是,对于私有字段(如 _url),EF Core会根据上述约定自动映射到对应的属性。
通过注解和Fluent API配置字段映射 如果字段名称不符合约定,可以通过以下方式手动配置映射关系:
使用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)
{
// 验证逻辑
_validatedUrl = url;
}
}
Fluent API配置
modelBuilder.Entity<Blog>()
.Property(b => b.Url)
.HasField("_validatedUrl");
仅限字段的属性 在某些情况下,实体类中可能只有私有字段而没有对应的CLR属性。此时可以通过以下方式配置:
配置仅限字段的属性
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;
}
}
PropertyAccessMode配置 可以通过设置不同的访问模式来控制EF Core如何访问属性和字段:
| 模式 | 描述 |
|---|---|
| Field | 强制所有属性访问都通过字段 |
| FieldDuringConstruction | 在构造实例时强制使用字段访问 |
| PreferField | 尽量通过字段访问属性,字段未知时通过属性 |
| PreferFieldDuringConstruction | 构造实例时优先字段访问,其他情况优先属性 |
| PreferProperty | 尽量通过属性访问,字段未知时使用字段 |
| Property | 强制通过属性访问,即使在构造时也不例外 |
