我正在尝试创建一个自定义实体框架(4.2)实体,该实体将映射到我的数据库,就像在代码优先方法中完成的那样。
问题是我的实体框架数据模型首先使用数据库。
如何将我的自定义实体添加到实体框架的上下文中?
我正在尝试创建一个自定义实体框架(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
有局限性:
QueryView
,并且您必须自己编写 Entity SQL 查询。我想保留 EDMX 文件,但也能够将实体 (BriefUser) 添加到 EF 的上下文中。
这是不可能的。您BreifUser
只是投影/视图,EF 无法将更改跟踪回原始表,因此您无法添加BreifUser
到上下文并保留它。如果QueryView
您定义自定义存储过程,则可以实现它,该过程不会如何分解BreifUser
和修改所有相关表。这些存储过程必须导入到 EDMX 并映射到视图实体的数据修改操作。顺便提一句。如果您将实体映射到数据库视图,也会发生同样的情况,因为 EF 将所有视图都视为只读。