1

用例

  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”文件的继承时,我希望相应的数据库表根据“UserProfile”生成,但是,派生类(UserProfile)的实体集名称设置为基类(UserInfo),省略了“确认令牌'。

是否可以通过将“UserProfile”用作数据库表而不是 UserInfo 的引用来定义@“.edmx”的继承?

4

1 回答 1

1

解决方案是将“模型优先”转换为“代码优先”,并让 DB 模型类从公开所选方法(非导航属性)的接口继承,然后 DAL 将公开该接口,避免脱离上下文导航属性访问。

不幸的是,我没有找到针对上述问题的 Model-First 解决方案,不得不使用 Code-First 。

于 2013-04-18T05:15:32.910 回答