EF延迟加载代理拦截器

时间:2019-12-05 15:25:41

标签: entity-framework entity-framework-6 devforce

我正在寻找一种方法来拦截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实施可以完美地解决此问题,但不幸的是,这不是我当前项目的选择。

1 个答案:

答案 0 :(得分:0)

您可以像这样在c#中使用空条件运算符

c.Person?.FirstName

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

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

相关问题