为什么从DbSet变换实体时,我DbModelBuilder配置忽略 .SqlQuery?(W

2019-09-22 03:37发布

我有一个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)是有办法利用英孚的DbModel知晓的实体映射器?

Answer 1:

事实上,当你执行一个原始的SQL查询中的列名映射被忽略。 这里有两个引用: 这很不满意线程只为了好玩,但下面一个从EF团队认真的回答:

从报价http://entityframework.codeplex.com/workitem/233 :

所述类SqlQuery方法被设计为不采取任何映射到帐户,包括正在使用的属性应用的映射。 它只是与从与该对象的属性名的成绩列名。 如果列名不匹配,你将需要使用列别名(AS在SQL Server中的关键字)的列中的结果重新命名。

我们同意将属性所以我们保留了这个问题开放,并把它在我们的积压未来考虑是必须做出SqlQuery类荣誉列中的选项很有用。

所以,唯一的解决方法似乎是一个明确的AS别名,而不是一个*在您的SQL查询指定你的属性名作为列别名:

return GetFromRawSql(@"
    SELECT wl.WishlistLineId AS PersistenceKey,
           wl.SomeOtherColumn AS SomeOtherProperty,
           ...
    ..."
    // ...


Answer 2:

我发现另一种解决方案是比较干净。 在我的模型,我有一个漂亮的名字,我想使用公共属性,并用完全相同的名称私人属性,如数据库,并在公共的,像这样的吸气返回专用值:

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



文章来源: Why is my DbModelBuilder configuration ignored when mapping Entity from DbSet.SqlQuery?