EF 延迟加载代理拦截器



我正在寻找一种方法来拦截实体框架的延迟加载代理实现,或以其他方式控制在访问数据库中可能没有值的导航属性时返回的内容。

我正在寻找的一个例子是这个联系人类,其中包含邮寄地址、商务电话等,可能有也可能没有联系人。

public partial class Contact
{
private Nullable<System.Guid> _personId;
public Nullable<System.Guid> PersonId 
{ 
get { return _personId; } 
set { SetProperty(ref _personId, value); } 
}
public virtual Person Person{ get; set; }
// mailing address, other properties...
}
public partial class Person
{
private string _firstName;
public string FirstName 
{ 
get { return _firstName; } 
set { SetProperty(ref _firstName, value); } 
}
private string _lastName;
public string LastName 
{ 
get { return _lastName;} 
set { SetProperty(ref _lastName;value); } 
}
}

在 ASP.net Razor 页面、WPF 或临时报告工具中,能够使用以下表达式非常有用:

Contact c = repo.GetContact(id);
Console.WriteLine("Contact Person " + c.Person.FirstName);

如果没有 PersonId,这当然会失败,因此联系。人为空。

像Ideablade Devforce这样的工具有一个机制,在这种情况下为Person返回一个"NullEntity",这使得WriteLine能够成功。 此外,可以将人员的 NullEntity 配置为具有 FirstName 的合理值,如"NA"。

是否有某种方法可以替代 EF 中的动态代理机制,或以其他方式截获对联系人的引用以启用此方案?

我已经调查了 IDbCommandInterceptor,但这似乎并没有拦截到单个实体属性的虚拟导航,只拦截到实体集合的导航。

更新_____________________________________

为了详细说明我最初的问题,我无法通过在表达式中引入 null 条件运算符来修改表达式,因为这些表达式已合并到由其他开发人员或作者创建的 WPF、ASP.Net Razor 绑定表达式和/或报表数据字段中。 此外,可能有多层空属性需要处理,例如 Contact.Person.Spouse.FirstName,其中 Person 和/或 Spouse 可能是"空"属性。 Devforce Ideablade 实现完美地处理了这个问题,但不幸的是,在我当前的项目中不是一个选项。

你可以像这样使用 C# 中的 null 条件运算符

c.Person?.FirstName

这意味着当 Person == null 时,返回 null 或以其他方式返回 FirstName。您仍然需要处理空值

请参阅: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/member-access-operators#null-conditional-operators--and-

最新更新