簡體   English   中英

ExpressMapper / EntityFramework - 沒有為此對象定義的無參數構造函數

[英]ExpressMapper / EntityFramework - No parameterless constructor defined for this object

我正在嘗試使用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>>();

在調用時獲取錯誤消息。

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; }
}

DiscountDay(由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個小時調試一個類似There was an error: System.MissingMethodException: No parameterless constructor defined for this object在ExpressMapper上There was an error: System.MissingMethodException: No parameterless constructor defined for this object錯誤There was an error: System.MissingMethodException: No parameterless constructor defined for this object ,我想我會對我的發現感興趣。

所以我們遇到了類似於你的情況,因為我們有像這樣的域模型(以下所有內容都是簡化示例):

public class Owner 
{
    public int? ID { get; set; }
    public string Name { get; set; }
}

public class Animal
{
    public int? ID { get; set; }
    public string Name { get; set; }
    public int? OwnerID { get; set; }
    [ForeignKey("OwnerID")]
    public Owner Owner { get; set; }
}

使用以下視圖模型(即我們的API發送和接收的內容):

public class AnimalViewModel
{
    public int? ID { get; set; }
    public string Name { get; set; }
    public string Owner { get; set; }
}

像這樣的映射:

Mapper.Register<Animal, AnimalViewModel>();
Mapper.Register<AnimalViewModel, Animal>();

在映射到域模型和視圖模型之間或者從映射模型映射時,我們會得到MissingMethodException ,盡管視圖模型和域模型都有公共的默認構造函數。 解決方案是手動映射域模型中的相關實體,並將它們從ExpressMapper的映射中排除,如下所示:

Mapper.Register<Animal, AnimalViewModel>()
    .Ignore(a => a.Owner);
Mapper.Register<AnimalViewModel, Animal>()
    .Ignore(a => a.Owner);

從閱讀EntityMapper的源代碼來看,似乎MissingMethodException是一個與實際問題無關的全紅鯡魚。 實際問題似乎是它無法弄清楚如何將一種類型轉換為另一種類型。 在我們的例子中 - 復雜對象如上所述映射到基元/從基元映射 - 從映射器中排除相關對象並手動完成就足夠了。

編輯:

在進一步調查之后,我們在我們的案例中追溯了根本問題,回到EF代理創建創建生成的類型(例如'MyModel_14289012'),這些類型與映射器中注冊的類型不匹配。 要防止這種情況,請將以下內容應用於上下文:

Context.Configuration.LazyLoadingEnabled = false;
Context.Configuration.ProxyCreationEnabled = false;

並手動包含模型中所需的任何嵌套/相關對象,如下所示:

Context.Animals
    .Include(a => a.Owner);

這將獲取相關實體,但作為其實際類型而不是EF生成的類型。

實體框架使用無參數構造函數來實例化類和反射以填充類屬性。 如果您有帶參數的構造函數,則隱藏默認的無參數構造函數,您必須將其添加到Entity Framework以供實體類使用。

但是,如果我將鏈接的實體映射到模型,那么我會收到錯誤

如果您的子實體缺少無參數構造函數並且延遲加載,則當EF嘗試實例化沒有無參數構造函數的子實體時,EF會失敗。

注意:無參數構造函數不必是公共的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM