gpt4 book ai didi

c# - ExpressMapper/EntityFramework - 没有为此对象定义无参数构造函数

转载 作者:太空狗 更新时间:2023-10-29 23:20:53 24 4
gpt4 key购买 nike

我正在尝试使用 ExpressMapper 将数据实体映射到模型。

如果我直接将实体映射到模型(它们都具有相同的属性)那么它工作正常。

但是如果我将链接的实体映射到模型,则会出现错误

There was an error: System.MissingMethodException: No parameterless constructor defined for this object.

数据库结构:

enter image description here

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 上的错误,我想我会同意我的发现。

所以我们遇到了和你类似的情况,因为我们有这样的领域模型(以下都是简化的例子):

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

使用以下 View 模型(即我们的 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>();

在映射到域模型和 View 模型或从域模型和 View 模型映射时,我们会得到 MissingMethodException,尽管 View 模型和域模型都有公共(public)的默认构造函数。解决方案是手动映射域模型中的相关实体,并将它们从 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 生成的类型。

关于c# - ExpressMapper/EntityFramework - 没有为此对象定义无参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37996111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com