用过Ado.Net实体框架的人可能都知道,使用实体框架自动生成工具生成的类有一个问题,就是当数据库中有外键存在的情况下,它是不直接生成对应外键的ID的,而是直接生成了一个引用对象System.Data.Objects.DataClasses.EntityReference<T>,这样就有一个问题了,就是当我们获取一个对象的时候它是不会自动把外键引用的对象加载的,而是必须通过System.Data.Objects.DataClasses.EntityReference<T>的Load()方法显示加载的!而在我们的实际项目开发过程中尤其是在写业务逻辑的时候你根本没办法知道你所使用的对象是否已经将该对象所引用的对象加载了,也就只能在每次使用的时候先判断一下该引用对象是否存在,如果不存在那么就显示加载该对象,这样的话是可以达到解决问题的效果,但你不觉得这样做有点麻烦吗?那有没有一种可以一劳永逸的方法呢?当然有!
下面以UserInfo和UserState为例:
UserInfo的定义如下:
public partial class UserInfo
{
public string UserName { get; set; }
public string Password { get; set; }
public UserState UserState { get; set; }
public System.Data.Objects.DataClasses.EntityReference<UserState> UserStateReference { get; set; }
}
UserState定义如下:
public partial class UserState
{
public int Id { get; set; }
public string Name { get; set; }
}
这里定义的类不是工具自动生成的,是我为了演示方便从新定义的!只是为了达到效果 。
我们可以查看工具生成的类,我们会发现这些类都是部分类,而这就留给我们足够的想象空间去扩展我们的需要;
在这里,我们建立一个部分类UserInfo.PatialClass.cs
在这个部分类中定义一个方法GetUserState(),这样我们在每次需要UserState的时只要调用这个方法就行了,而无需考虑UserState是否已经加载
定义如下:
public partial class UserInfo
{
/// <summary>
/// 获取UserState
/// </summary>
public UserState GetUserState()
{
if (this.UserState == null)
this.UserStateReference.Load();
return this.UserState;
}
}
至此,你以后在需要UserState的时候无需再担心是否已经加载,也不需要每次调用的时候判断是否已经加载!
事实上我自己为了方便更是自己做了一个小工具,让这个工具自动给我们生成我们需要的部分类,类中的定义就是像上面UserInfo.PatialClass.cs定义的一样。
在下一篇我会贴出工具的代码!