实体框架:数据库优先/代码优先混合

时间:2011-11-28 10:19:57

标签: entity-framework database-first

我正在尝试创建一个自定义的Entity Framework(4.2)实体,该实体将映射到我的数据库,就像在Code第一种方法中一样。

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

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

1 个答案:

答案 0 :(得分: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定义为新的实体类型,因为将UserBriefUser映射到UserTbl会违反此规则。您必须使用名为QueryView的特殊构造。

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

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

我想保留EDMX文件,但也可以添加实体   (BriefUser)到EF的背景。

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