5

ExpressMapper を使用して、データ エンティティをモデルにマップしようとしています。

エンティティをモデルに直接マップすると (両方とも同じプロパティを持つ)、正常に動作します。

しかし、リンクされたエンティティをモデルにマップすると、エラーが発生します

エラーが発生しました: System.MissingMethodException: このオブジェクトにパラメーターなしのコンストラクターが定義されていません。

データベース構造:

ここに画像の説明を入力

ExpressMapper 登録:

Mapper.Register<DiscountDaysOfWeek, DiscountDaysOfWeekModel>()
      .Member(dest => dest.DiscountDayId, src => src.DiscountDayId)
      .Member(dest => dest.DiscountDaysOfWeekId, src => src.DiscountDaysOfWeekId)
      .Member(dest => dest.DiscountId, src => src.DiscountId)
      .Member(dest => dest.Discountday, src => src.DiscountDay.Day);

次のように呼び出されます。

var disDays = discs.SelectMany(x => x.DiscountDaysOfWeeks)
                   .Map<IQueryable<DiscountDaysOfWeek>, IQueryable<DiscountDaysOfWeekModel>>();

呼び出し時にエラー メッセージを取得します。

割引日数モデル:

public class DiscountDaysOfWeekModel
{
    public int DiscountDaysOfWeekId { get; set; }
    public int DiscountId { get; set; }
    public int DiscountDayId { get; set; }
    public string Discountday { get; set; }
}

DiscountDayOfWeek (EF によって生成)

public partial class DiscountDaysOfWeek
{
    public int DiscountDaysOfWeekId { get; set; }
    public int DiscountId { get; set; }
    public int DiscountDayId { get; set; }

    public virtual DiscountDay DiscountDay { get; set; }
    public virtual Discount Discount { get; set; }
}

割引日 (EF によって生成):

public partial class DiscountDay
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public DiscountDay()
    {
        this.DiscountDaysOfWeeks = new HashSet<DiscountDaysOfWeek>();
    }

    public int DiscountDayId { get; set; }
    public string Day { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<DiscountDaysOfWeek> DiscountDaysOfWeeks { get; set; }
}

サンプルの作業: 以下の作業サンプルでは、​​モデルとエンティティは同じプロパティを持っています

Mapper.Register<DiscountPreventedPriceEnding, DiscountPreventedPriceEndingModel>();

var execPriceEndings = discs.SelectMany(x => x.DiscountPreventedPriceEndings)
                            .Map<IQueryable<DiscountPreventedPriceEnding>, IQueryable<DiscountPreventedPriceEndingModel>>();

どんな助けでも大歓迎です。

4

2 に答える 2

0

Entity Framework は、パラメーターなしのコンストラクターを使用してクラスをインスタンス化し、リフレクションを使用してクラス プロパティを設定します。パラメーターを持つコンストラクターがある場合、既定のパラメーターなしのコンストラクターは非表示になり、Entity Framework で使用するには、それを Entity クラスに追加する必要があります。

しかし、リンクされたエンティティをモデルにマップすると、エラーが発生します

子エンティティにパラメーターなしのコンストラクターがなく、遅延ロードされている場合、パラメーターなしのコンストラクターを持たない子エンティティをインスタンス化しようとすると、EF は失敗します。

注: パラメーターなしのコンストラクターはパブリックである必要はありません。

于 2016-06-23T18:54:14.457 に答える