C# 为什么从DbSet映射实体时会忽略我的DbModelBuilder配置<;T>;。SqlQuery?

C# 为什么从DbSet映射实体时会忽略我的DbModelBuilder配置<;T>;。SqlQuery?,c#,entity-framework-4,C#,Entity Framework 4,我有一个DbModel配置,如下所示: modelBuilder.Entity<WishlistLine>() .HasKey(w => w.PersistenceKey) .Property(w => w.PersistenceKey) .HasColumnName("WishlistLineId"); modelBuilder.Entity() .HasKey(w=>w.PersistenceK

我有一个
DbModel
配置,如下所示:

modelBuilder.Entity<WishlistLine>()
            .HasKey(w => w.PersistenceKey)
            .Property(w => w.PersistenceKey)
            .HasColumnName("WishlistLineId");
modelBuilder.Entity()
.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();
}
public IEnumerable FetchWishListLines使用logonName(字符串logonName)
{
返回GetFromRawSql(@)
从WishlistLines wl中选择wl.*
wl.AccountId=a.AccountId上的内部联接帐户a
在u.AccountId=a.AccountId上左加入用户u
其中u.LogonName=@p0”,LogonName);
}
受保护的IEnumerable GetFromRawSql(字符串sqlQuery,参数对象[]参数)
{
return_dbSet.SqlQuery(SqlQuery,parameters.ToList();
}
我可以通过EF将
WishlistLines
保存到数据库中,没有任何问题。当我运行此查询时,虽然我得到以下错误:

数据读取器与指定的“DataAccessLayer.DatabaseContext.WishlistLine”不兼容。“PersistenceKey”类型的成员在数据读取器中没有同名的对应列。

我知道使用
DbSet.SqlQuery()
会将返回的数据映射到实体,但它似乎忽略了
DbModel
配置。根据错误消息判断(猜测)正在使用错误的数据读取器

因此:

A) 我做错什么了吗


B) 有没有办法使用EF的
DbModel
感知实体映射器?

实际上,在执行原始SQL查询时,列名映射会被忽略。这里有两个参考:非常不满意的线程只是为了好玩,但下面的一个来自EF团队的严肃回答:

引自:

SqlQuery方法的设计不考虑任何映射, 包括使用属性应用的映射。它完全匹配 结果中的列名以及对象中的属性名。 如果列名不匹配,则需要使用列别名 (作为SQL Server中的关键字)重命名结果中的列

我们同意,可以选择使用SqlQuery是很有用的 尊重专栏的属性,所以我们将继续讨论这个问题 这是我们的积压工作,以备将来考虑

因此,唯一的解决方法似乎是在SQL查询中将属性名称指定为列别名的SQL查询中使用显式的
AS
别名,而不是
*

返回GetFromRawSql(@”
选择wl.WishlistLineId作为PersistenceKey,
wl.SomeOther列作为SomeOtherProperty,
...
..."
// ...

我找到了另一个非常干净的解决方案。在我的模型中,我有公共属性和我想要使用的好名称,私有属性和数据库中的名称完全相同,并在公共属性的getter中返回私有值,如下所示:

public class KeywordsStatistic
{
    public string Keyword { get { return lib_motcle; } }
    public int NumActions { get { return nbrActions; } }

    private string lib_motcle { get; set; }
    private int nbrActions { get; set; }
}
当然,如果需要更新值,则需要对其进行修改,但原则是相同的


HTH

您需要在DBContext中运行查询。顺便说一句,为什么需要sql查询来检索数据?为什么不在rDBContext中使用Linq?