我正在尝试创建一个自定义的Entity Framework(4.2)实体,该实体将映射到我的数据库,就像在Code第一种方法中一样。
问题是我的实体框架数据模型首先使用数据库。
如何将自定义实体添加到实体框架的上下文?
答案 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定义为新的实体类型,因为将User
和BriefUser
映射到UserTbl
会违反此规则。您必须使用名为QueryView的特殊构造。
QueryView
是映射级别的视图。它允许您创建新的映射类型,即直接在EDMX的MSL部分中定义的现有映射实体的投影。投影定义为自定义实体SQL查询。问题是QueryView
有局限性:
QueryView
,并且您必须自己编写实体SQL查询。我想保留EDMX文件,但也可以添加实体 (BriefUser)到EF的背景。
这是不可能的。您的BreifUser
只是投影/视图,而EF无法跟踪对原始表的更改,因此您无法将BreifUser
添加到上下文并保留它。在QueryView
的情况下,如果您定义自定义存储过程而无法如何分解BreifUser
并修改所有相关表,则可以实现它。必须将这些存储过程导入EDMX并映射到视图实体的数据修改操作。顺便说一句。如果将实体映射到数据库视图,则会发生同样的情况,因为EF会将所有视图视为只读。