0

我正在尝试创建一个自定义实体框架(4.2)实体,该实体将映射到我的数据库,就像在代码优先方法中完成的那样。

问题是我的实体框架数据模型首先使用数据库。

如何将我的自定义实体添加到实体框架的上下文中?

4

1 回答 1

1

如果首先使用数据库意味着您已经从现有数据库中创建了 EDMX,那么您根本无法首先使用代码。您必须从数据库创建表和更新模型 (EDMX) 以将其包含在 EDMX 中。

根据评论编辑:

我想创建一个 BriefUser 实体,它基本上是一个较轻版本的用户,但它会从用户的外键中检索到属性。

嗯,这是可能的。您可以将 BriefUser 创建为公共类并在查询中使用投影。

var breifUser = (from x in context.Users
                 where ...
                 select new BriefUser
                 {
                     // Fill BreifUser's properties here
                 }).FirstOrDefault();

您甚至可以将以前的代码重构为可重用的扩展方法:

public static IQueryable<BriefUser> ProjectUser(this IQueryable<User> query)
{
    return query.Select(x => new BreifUser() 
                             { // Fill BreifUser's properties here });
}

并像这样使用它:

var briefUser = context.Users.ProjectUser().FirstOrDefault(...);

也可以将您的新类定义为“实体视图”。第一个问题是每个表只能映射到一个实体(继承或拆分等一些高级概念除外),因此您不能将 BriefUser 定义为新的实体类型,因为同时映射User和映射BriefUserUserTbl违反此规则。您必须使用名为QueryView的特殊构造。

QueryView是映射级别的视图。它允许您创建新的映射类型,它是直接在 EDMX 的 MSL 部分中定义的现有映射实体的投影。投影定义为自定义实体 SQL 查询。问题是QueryView有局限性:

  • 它不提供所有 Entity SQL 功能——例如它不支持聚合(我认为这是真正缺少的功能)。例如,如果没有聚合,您将无法创建一个新类型,该类型将包含对一些相关实体进行计数的属性。
  • 设计器不支持它。您必须将 EDMX 编辑为 XML 来定义QueryView,并且您必须自己编写 Entity SQL 查询。
  • 结果类型是“视图”,它是只读的。

我想保留 EDMX 文件,但也能够将实体 (BriefUser) 添加到 EF 的上下文中。

这是不可能的。您BreifUser只是投影/视图,EF 无法将更改跟踪回原始表,因此您无法添加BreifUser到上下文并保留它。如果QueryView您定义自定义存储过程,则可以实现它,该过程不会如何分解BreifUser和修改所有相关表。这些存储过程必须导入到 EDMX 并映射到视图实体的数据修改操作。顺便提一句。如果您将实体映射到数据库视图,也会发生同样的情况,因为 EF 将所有视图都视为只读。

于 2011-11-28T10:34:03.863 回答