2

私は Dapper.Net を使い始めて、今のところとても気に入っていますが、1 つの問題に遭遇しました。

次のような POCO クラスがあるとします。

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get { return FirstName + " " + LastName; } }
}

ここで、Dapper.Net と Dapper.Net 拡張機能を使用して、次のようにして、そのデータ型のすべてのインスタンスを DB から単純にロードします。

string connectionString = CloudConfigurationManager.GetSetting("DBConnection");
using (SqlConnection cn = new SqlConnection(connectionString))
{
    cn.Open();

    IEnumerable<Types.Person> entities = cn.GetList<Types.Person>();
    var forceMe = entities.ToList();
}

これはLinqセットアップでは正常に機能しますが、評価を強制する.ToList()のある行に到達すると、FullNameで「無効な列名」が発生します。NotMapped の Entity Framework DataAnnotations を尊重する可能性があると考えて、NotMapped 属性を追加してみました (プロジェクトに EF 5 を追加した後)。これはうまくいきませんでした。

問題は、列が DB から期待されないことを Dapper.Net にどのように伝えるかということです。これは、モデル POCO で表示されるすべての DB 列をマップしようとしている拡張機能の問題ですか? SQL の記述に戻り、必要な列のみを明示的に要求する必要がありますか、または列で NotMapped と同等のものを取得する方法はありますか?

4

1 に答える 1

5

特定のプロパティのマッピングを無視する唯一の方法は、カスタム フィールド マッピングを指定できる自動クラス マッパーを実装することだと思います。例えば:

public class CustomMapper : ClassMapper<Foo>
{
    public CustomMapper()
    {
        Table("FooTable");
        Map(f => f.Id).Column("FooId").Key(KeyType.Identity);
        Map(f => f.DateOfBirth).Column("BirthDate");
        Map(f => f.FirstName).Column("First");
        Map(f => f.LastName).Column("Last");
        Map(f => f.FullName).Ignore();
        Map(f => f.Calculated).ReadOnly();
    }
}

public class Foo
{
    public int Id { get; set; }
    public DateTime DateOfBirth { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName
    {
        get { return string.Format("{0} {1}", FirstName, LastName); }
    }
}

上記の例では、FullName は無視されています。

自動マッパーを使用すると、POCO クラス名がテーブル名と一致しない場合にテーブル名を調整することもできます。

また、POCO クラスと同じアセンブリにカスタム マップを保持する必要があることに注意してください。ライブラリはリフレクションを使用してカスタム マップを検索し、1 つのアセンブリのみをスキャンします。

これが役に立てば幸いです、頑張ってください

于 2012-09-25T16:56:19.957 に答える