2

私は EF と AutoMapper を初めて使用し、それを使用して Web サービスを作成しようとしています。EF エンティティを直接シリアル化しようとすると、シリアル化できないため、ナビゲーション プロパティでエラーがスローされます。それらを抑制する方法を見つけたいのですが、これを行う最善の方法は、データ転送オブジェクトとして使用する POCO を作成することだと言われています。

(この時点で、ADO.NET を使用して独自の DTO を作成した方がよいと考えています。EF を使用すると、独自のクラスを作成する手間が省けるのではないでしょうか?)

EF エンティティを POCO に自動的にマップする方法として AutoMapper を推奨してもらったので、POCO をロードする次の手順で AutoMapper を使用してみました。

Public Sub Load(ByVal lngUserId As Long)

    Dim query = From u In db.Users
                Where u.UserID = lngUserId
                Select u

    AutoMapper.Mapper.Map(query.FirstOrDefault(), Me)

End Sub

問題は、AutoMapper によって自動的に無視されないように見える、ナビゲーション プロパティに再び関連していることが判明したエラーが発生することです。

そこで、AutoMapper に nav プロパティを強制的に無視させるために、次の行を追加しようとしました。

Dim oMap = Mapper.CreateMap(Of User, UserDto).ForSourceMember(Sub(src) src.tblUserFarms, Sub(opt) opt.Ignore())

(tblUserFarms は nav プロパティです)

私が見つけた C# の例からこの構文を変換しましたが、.ForSourceMember の最初のパラメーターは Lambda 式であると想定されていないようで、使用方法の良い例が見つかりません。

私は正しいアプローチを使用していますか、それともまったく別の方法を試す必要がありますか? この問題を回避するには、nav プロパティをすべて削除するだけで、それらの利点が失われますか? EF は仕事に適したツールでさえありますか?

4

1 に答える 1

3

以下は、私が行ってきた方法のコードスニペットです。無視を設定すると、ナビゲーション プロパティ オブジェクトが読み込まれるのを回避できます (パフォーマンスも向上します)。

public domain.Entities.UserProfile GetUserProfile(string userName)
    {

        Mapper.CreateMap<Entities.UserProfile, domain.Entities.UserProfile>()
            .ForMember(dest => dest.BillingAddress, opt => opt.Ignore())
            .ForMember(dest => dest.ShippingAddress, opt => opt.Ignore())
            .ForMember(dest => dest.Orders, opt => opt.Ignore())
            .ForMember(dest => dest.ShoppingCartItems, opt => opt.Ignore());

        Entities.UserProfile storedProfile = db.UserProfiles.FirstOrDefault(x => x.UserName.Equals(userName));
        var profile = Mapper.Map<Entities.UserProfile, domain.Entities.UserProfile>(storedProfile);

        return profile;
    }

これが私のUserProfileを定義した方法です

 public class UserProfile
{
    public virtual int UserId { get; set; }
    public virtual string UserName { get; set; }
    public virtual string Prefix { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string MiddleName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string EmailAddress { get; set; }
    public virtual string Company { get; set; }
    public virtual string PhoneNumber { get; set; }
    public virtual string FaxNumber { get; set; }

    private ICollection<ShoppingCartItem> _shoppingCartItems;
    private ICollection<Address> _addresses;
    private ICollection<Order> _orders;

    /// <summary>
    /// Default billing address
    /// </summary>
    public virtual Address BillingAddress { get; set; }

    /// <summary>
    /// Default shipping address
    /// </summary>
    public virtual Address ShippingAddress { get; set; }

    /// <summary>
    /// Gets or sets customer addresses
    /// </summary>
    public virtual ICollection<Address> Addresses
    {
        get { return _addresses ?? (_addresses = new List<Address>()); }
        protected set { _addresses = value; }
    }

    /// <summary>
    /// Gets or sets orders
    /// </summary>
    public virtual ICollection<Order> Orders
    {
        get { return _orders ?? (_orders = new List<Order>()); }
        protected set { _orders = value; }
    }

    /// <summary>
    /// Gets or sets shopping cart items
    /// </summary>
    public virtual ICollection<ShoppingCartItem> ShoppingCartItems
    {
        get { return _shoppingCartItems ?? (_shoppingCartItems = new List<ShoppingCartItem>()); }
        protected set { _shoppingCartItems = value; }
    }

}
于 2014-03-19T04:44:14.670 に答える