4

私は次のDbModelような構成を持っています:

modelBuilder.Entity<WishlistLine>()
            .HasKey(w => w.PersistenceKey)
            .Property(w => w.PersistenceKey)
            .HasColumnName("WishlistLineId");

次の 2 つの方法でクエリを実行しています。

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認識エンティティ マッパーを利用する方法はありますか?

4

2 に答える 2

2

実際、生の SQL クエリを実行すると、列名のマッピングは無視されます。ここに 2 つの参照があります:このかなり不満なスレッドは楽しみのためだけですが、次のスレッドには EF チームからの深刻な回答があります。

http://entityframework.codeplex.com/workitem/233からの引用:

SqlQuery メソッドは、属性を使用して適用されるマッピングを含め、マッピングを考慮しないように設計されています。結果の列名をオブジェクトのプロパティ名と単純に一致させます。列名が一致しない場合は、列エイリアス (SQL Server の AS キーワード) を使用して、結果の列の名前を変更する必要があります。

SqlQuery が列属性を尊重するようにするオプションがあると便利であることに同意するので、この問題を未解決のままにし、将来の検討のためにバックログに入れています。

したがって、唯一の回避策は、プロパティ名を列エイリアスとして指定する SQL クエリではASなく、明示的なエイリアスのようです。*

return GetFromRawSql(@"
    SELECT wl.WishlistLineId AS PersistenceKey,
           wl.SomeOtherColumn AS SomeOtherProperty,
           ...
    ..."
    // ...
于 2012-09-11T21:39:07.020 に答える