2011-11-28 223 views
0

我想创建一个自定义实体框架(4.2)实体,它将映射到我的数据库,就像它将在代码优先的方法中完成的一样。实体框架:数据库优先/代码优先混合

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

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

回答

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将所有视图视为只读视图。

+0

是的,我确实有EDMX。所以我*必须*为我的数据模型中的每个实体都有一个表(或视图)?我不能只拥有一个具有映射到其他实体属性的属性的对象(所以它仍然在EF的上下文中)。 –

+0

对不起。我可能不明白你的问题。那么你真的想做什么? –

+0

假设我的数据库中有一个UserTbl表。 此'UserTbl'表映射到我的EDMX文件中的EF实体('用户')。 我想创建'BriefUser'实体,该实体基本上是'User'的一个较轻版本,但是它会从'User'的外键检索属性。 我想保留EDMX文件,但也能够在EF的上下文中添加一个实体('BriefUser')。所以基本上'BriefUser'和'User'将被映射到相同的数据。 - 我希望能够做到这一点,而无需在数据库中创建表或视图。 –