2

次の 2 つのクラスがあります (簡潔にするために多くのプロパティを省略しています)。

サービス層 POCO:

public class TicketFlag
{
    public ContactKey ContactKey;
}

LINQ to SQL で生成された POCO:

public class TicketFlag
{
    public string ContactKey;    
}

AutoMapper を使用して、サービス呼び出しでこれら 2 つの間をマッピングしようとすると、データベースの保存時に次の例外が発生します。

Exception of type 'AutoMapper.AutoMapperMappingException' was thrown.
 ---> System.ArgumentException: Type 'ContactKey' does not have a default constructor

ContactKey には、意図的に既定のコンストラクターがありません。基本的に、文字列とオブジェクトのリストを受け取り、それ自体をシリアル化/逆シリアル化できます。

私は次のようにマッピング関数を作成しようとしました(そしてそれは逆です):

Mapper.CreateMap<string, ContactKey>().ConvertUsing(s => ContactKeySerializer.Serialize(s));

しかし、ContactKey には既定のコンストラクターがないため、まだ苦情が寄せられています。

AutoMapper がデフォルトのコンストラクターを使用してプロパティ マッピングを行わないようにする方法はありますか? 実際には、ContactKey のプロパティをマッピングするだけでは十分ではありません。コンストラクターを呼び出すか、ContactKeySerializer クラスから吐き出す必要があります。

4

2 に答える 2

2

まず、おそらくフィールドではなく、これらのものにプロパティを使用する必要があります。しかし、それがあなたの問題の一部であるとは思えません。

stringからへのマップを作成しようとする代わりに、マップContactKeyのこの部分を一方から他方TicketFlagへ作成することを試みることができます。

Mapper.CreateMap<LINQtoSQL.TicketFlag, Service.Layer.TicketFlag>()
 .ForMember(dest => dest.ContactKey,
 mem => mem.ResolveUsing(src => ContactKeySerializer.Serialize(src.ContactKey)));

これにより、発生しているエラーを防ぐことができると思います。

于 2013-09-26T19:20:07.473 に答える
1

AutoMapper は、値をマップする前にターゲット クラスの空のインスタンスを作成する必要があるため、デフォルトのコンストラクターがないことを訴えています。ContractKey のパラメーター化されたコンストラクターを呼び出すことはできません。

この場合、コンストラクターが次のように見える場合、単純に見えるかもしれません。

public ContracktKey(string keyValue){}

しかし、2 つのパラメーターがある場合はどうなるでしょうか。

public ContracktKey(string keyValue, string otherValue){}

値をどこに置くべきかをどのように知るのでしょうか? 文字列を 1 つだけ指定した場合はどうなりますか?

TicketFlag他の人のアドバイスに従い、2 つのオブジェクトをマッピングするのが最善だと思います。

于 2013-09-26T19:54:36.123 に答える