EF edmx inheritance

本文关键字:inheritance edmx EF | 更新日期: 2023-09-27 18:09:29

用例

  1. 围绕实体框架实施DAL,以实现未来的ORM替换
  2. DAL是部分公开EF生成的类
  3. 要与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

EF edmx inheritance

解决方案是将"Model First"转换为"Code First",并让DB Model类从公开所选方法(非导航属性(的接口继承,然后DAL将公开该接口,避免上下文外的导航属性访问。

不幸的是,我没有为上述问题找到模型优先的解决方案,不得不采用代码优先。