[英]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.