我正在寻找一种方法来拦截Entity Framework的延迟加载代理实现,或者控制访问数据库中可能没有任何值的Navigation属性时返回的内容。
我要查找的示例是此Contact类,其中包含通讯地址,公司电话等,可能有也可能没有联系人。
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,那当然会失败,因此contact.Person为null。
在这种情况下,诸如Ideablade Devforce之类的工具都具有为Person返回“ NullEntity”的机制,该机制使WriteLine成功。另外,可以将Person的NullEntity配置为对FirstName具有合理的值,例如“ NA”。
是否有某种方法可以覆盖EF中的动态代理机制,或者以其他方式拦截对联系人的引用以启用此方案?
我已经研究了IDbCommandInterceptor,但这似乎并未拦截对单个实体属性的虚拟导航,而只是对实体集合的导航。
更新_____________________________________
要详细说明我的原始问题,我无法通过在其中引入空条件运算符来修改表达式,因为这些表达式已合并到WPF,ASP.Net Razor绑定表达式和/或报表数据字段中,这些字段由其他开发人员或作者。同样,可能存在多层的空属性要处理,例如Contact.Person.Spouse.FirstName,其中“人”和/或“配偶”可能是“空”属性。 Devforce Ideablade实施可以完美地解决此问题,但不幸的是,这不是我当前项目的选择。
答案 0 :(得分:0)
您可以像这样在c#中使用空条件运算符
c.Person?.FirstName
这意味着当Person == null时,返回null或以其他方式返回FirstName。您仍然需要处理空值