实体框架:数据库优先/代码优先混合
我想创建一个自定义实体框架(4.2)实体,它将映射到我的数据库,就像它将在代码优先的方法中完成的一样。实体框架:数据库优先/代码优先混合
问题是我的实体框架数据模型首先使用数据库。
如何将我的自定义实体添加到实体框架的上下文中?
如果数据库首先表示您已经拥有从退出数据库创建的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
和BriefUser
映射到UserTbl
会违反此规则。您必须使用称为QueryView的特殊结构。
QueryView
是映射级别的视图。它允许您创建新的映射类型,这是直接在EDMX的MSL部分中定义的现有映射实体的投影。投影被定义为自定义实体SQL查询。问题是QueryView
有局限性:
- 它不提供所有实体SQL功能 - 例如它不支持聚合(我认为它是真正缺少的功能)。例如,如果没有聚合,你不能创建一个新的类型,它将包含一些相关实体的属性。
- 它在设计器中不受支持。您必须将EDMX编辑为XML来定义
QueryView
,并且您必须自己编写实体SQL查询。 - 生成的类型是一个“视图”,它是只读的。
我想保持EDMX文件,而且还可以到实体 (BriefUser)添加到EF的上下文。
这是不可能的。您的BreifUser
只是投影/视图,EF无法跟踪更改回原始表,因此您不能将BreifUser
添加到上下文并保留它。在QueryView
的情况下,如果您定义的自定义存储过程不会如何分解BreifUser
并修改所有相关表,则可以实现此功能。这些存储过程必须导入到EDMX并映射到视图实体的数据修改操作。顺便说一句。如果将实体映射到数据库视图,也会发生同样的情况,因为EF将所有视图视为只读视图。
是的,我确实有EDMX。所以我*必须*为我的数据模型中的每个实体都有一个表(或视图)?我不能只拥有一个具有映射到其他实体属性的属性的对象(所以它仍然在EF的上下文中)。 –
对不起。我可能不明白你的问题。那么你真的想做什么? –
假设我的数据库中有一个UserTbl表。 此'UserTbl'表映射到我的EDMX文件中的EF实体('用户')。 我想创建'BriefUser'实体,该实体基本上是'User'的一个较轻版本,但是它会从'User'的外键检索属性。 我想保留EDMX文件,但也能够在EF的上下文中添加一个实体('BriefUser')。所以基本上'BriefUser'和'User'将被映射到相同的数据。 - 我希望能够做到这一点,而无需在数据库中创建表或视图。 –