EF edmx inheritance
本文关键字:inheritance edmx EF | 更新日期: 2023-09-27 18:09:29
用例
- 围绕实体框架实施DAL,以实现未来的ORM替换
- DAL是部分公开EF生成的类
- 要与Model First一起使用的实体框架(DB尚不存在(
分析
- 要启用EF生成的类的部分公开,必须确保不应在上下文之外公开EF导航道具。此外,由于安全原因,不应直接公开值的子集
- 为此,最佳解决方案是使用继承,其中~local~属性在基类中实现,导航属性添加到派生类中,这样,DAL只能公开基类,从而优雅地避免了上下文外的导航属性公开
示例
class UserInfo
{
public int UserId { get; set; }
public string DisplayName { get; set; }
public DateTime CreationTime { get; set; }
public DateTime LastModified { get; set; }
}
class UserProfile : public UserInfo
{
// I don't want this to be directly exposed out of the DAL
public string ConfirmationToken { get; set; }
// Navigation property
public virtual ICollection<UserVariant> Variants { get; set; }
}
class DAL
{
// Returned value include no navigation properties
public UserInfo GetUser(int UserId) { ... }
}
需要解决的问题
- 在使用继承@".edmx"文件时,我希望相应的DB表根据"UserProfile"生成,但是,派生类的实体集名称(UserProfile(设置为基类(UserInfo(,省略了"confirmationToken">
是否可以在'.edmx'中定义继承,从而将'UserProfile'用作DB表的引用,而不是UserInfo
解决方案是将"Model First"转换为"Code First",并让DB Model类从公开所选方法(非导航属性(的接口继承,然后DAL将公开该接口,避免上下文外的导航属性访问。
不幸的是,我没有为上述问题找到模型优先的解决方案,不得不采用代码优先。