- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 DbModel
像这样配置:
modelBuilder.Entity<WishlistLine>()
.HasKey(w => w.PersistenceKey)
.Property(w => w.PersistenceKey)
.HasColumnName("WishlistLineId");
我有一个通过以下两种方法运行的查询:
public IEnumerable<WishlistLine> FetchWishlistLinesUsingLogonName(string logonName)
{
return GetFromRawSql(@"
SELECT wl.* FROM WishlistLines wl
INNER JOIN Accounts a ON wl.AccountId = a.AccountId
LEFT JOIN Users u ON u.AccountId = a.AccountId
WHERE u.LogonName = @p0", logonName);
}
protected IEnumerable<TEntity> GetFromRawSql(string sqlQuery, params object[] parameters)
{
return _dbSet.SqlQuery(sqlQuery, parameters).ToList();
}
我可以“保存”WishlistLines
通过EF进入数据库没有任何问题。当我运行这个查询时,我得到了这个错误:
The data reader is incompatible with the specified 'DataAccessLayer.DatabaseContext.WishlistLine'. A member of the type, 'PersistenceKey', does not have a corresponding column in the data reader with the same name.
我知道使用 DbSet<T>.SqlQuery()
会将返回的数据映射到实体,但它似乎忽略了 DbModel
配置。根据错误信息判断(猜测)使用了错误的数据读取器。
所以:
A) 我做错了什么吗?
B) 有没有办法利用 EF 的 DbModel
感知实体映射器?
最佳答案
实际上,当您执行原始 SQL 查询时,列名映射会被忽略。这里有两个引用:This非常不满意的线程只是为了好玩,但以下是 EF 团队的严肃回答:
引自 http://entityframework.codeplex.com/workitem/233 :
The SqlQuery method is designed not to take any mapping into account, including mapping that is applied using attributes. It simply matches the column names from the results with property names in the object. If the column names don't match you will need to use a column alias (AS keyword in SQL Server) to rename the column in the results.
We agree that it would be useful to have the option to make SqlQuery honor Column attributes so we're keeping this issue open and putting it on our backlog for future consideration.
因此,唯一的解决方法似乎是在 SQL 查询中使用显式 AS
别名而不是 *
将属性名称指定为列别名:
return GetFromRawSql(@"
SELECT wl.WishlistLineId AS PersistenceKey,
wl.SomeOtherColumn AS SomeOtherProperty,
...
..."
// ...
关于c# - 为什么在从 DbSet<T>.SqlQuery 映射实体时忽略我的 DbModelBuilder 配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12282757/
在我的解决方案中,我有几个项目,它们一起构成了一个网络应用程序的一部分。 我正忙于设置 Entity Framework ,并在我的上下文类中,而不是必须在 protected override vo
我的数据库中有一个表,其复合主键由 foo 和 bar 组成。如果我这样做 private static void EfMapMyTableAdded(DbModelBuilder modelBuil
我正在尝试在我们的 EF 6 项目中实现软删除。我们正在使用数据库优先方法,我注意到您不能覆盖 OnModelCreating。 使用代码优先方法时,可以为特定实体应用全局过滤器,如本 blog po
我计划在我的下一个项目中使用 Entity Framework 4.1,但我很难找到实现它的好方法。简而言之,我想构建一个多层应用程序,其中实体将通过 Web 服务进行传输,并且为了尽可能保持干净,我
我昨晚在另一台电脑上创建了一个 MVC 项目用于测试它在那台电脑上运行良好,但是当我想在我自己的电脑上构建它时,我给出了错误:找不到类型或命名空间名称“DbModelBuilder”(您是否缺少...
我有一个 DbModel像这样配置: modelBuilder.Entity() .HasKey(w => w.PersistenceKey) .Pro
我正在基于我的 poco 类上的属性动态执行流畅的映射,我的 .Property 案例工作正常,但在尝试运行 .Ignore() 方法时失败了: private void AddEntities(Db
我得到的完整错误是这样的: 无法检查模型兼容性,因为数据库不包含模型元数据。确保已将 IncludeMetadataConvention 添加到 DbModelBuilder 约定中。 我已经在 SQ
我在 WinForms 项目 .net 4.5 中使用 EntityFramework 5.0 版。 我已经为我创建了 2 个重要的实体 public class Role {
我正在使用 EntityFramework,但在某些情况下我会遇到此异常: threw an exception.", inner exception: "Method not found: 'Voi
我是一名优秀的程序员,十分优秀!