【问题标题】:Error returning a mapped Business Object to an EF Entity partial class将映射的业务对象返回到 EF 实体部分类时出错
【发布时间】:2013-02-26 15:39:11
【问题描述】:

我正在尝试将业务对象映射到数据优先的自动生成实体。但是,我在我的映射器类中遇到错误,我正在返回 new Lab

错误是"Cannot Convert expression type 'LabManager.DataAcces.Lab' to return type LabManager.BusinessObjects.BusinessObjects.Lab"

我的问题是:当我在映射器类中准确返回预期的内容时,为什么会出现此错误?

我的业务对象如下所示:

namespace LabManager.BusinessObjects.BusinessObjects
{
    public class Lab
    {
        public Lab()
        {

        }
        public int Id { get; set; }
        public string Name { get; set; }
        public IList<Cylinder> Cylinders { get; set; }
    }
}

我将业务对象映射到的实体是:

public partial class Lab
{
    public Lab()
    {
        this.Cylinders = new HashSet<Cylinder>();
    }

    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Cylinder> Cylinders { get; set; }
}

我只是在使用手动映射器类(没有 AutoMapper):

namespace EmitLabManager.DataAccess.ModelMapper
public class Mapper
{
   internal static BusinessObjects.BusinessObjects.Lab GetLabs(Lab entity)
   {
        return new Lab
        {
             Id = entity.Id,
             Name = entity.Name,
             Cylinders = entity.Cylinders
        };
    }
}

【问题讨论】:

  • 为什么你只在方法声明中使用 Lab 的完整类型名,而不是到处使用?
  • @Kniganapolke 这是个好问题。我想我应该。我以前从来没有真正获得过这样的资格。我通常尽量保持我的对象名称相当独特,因此不必以这种方式限定。我很可能也会重构名称和冗余命名空间(BusinessObjects.BusinessObjects)。

标签: c# entity-framework


【解决方案1】:

您很可能存在命名空间冲突。您需要完全限定 GetLabs 函数中的构造函数:

return new BusinessObjects.BusinessObjects.Lab
    {
         Id = entity.Id,
         Name = entity.Name,
         Cylinders = entity.Cylinders
    };

这应该可以解决问题。

【讨论】:

  • 感谢您的回答。将该命名空间添加到初始化程序确实清除了 ID 和 Name 上的“红色”,但我在初始化 Cylinders 的行上仍然出现错误。现在的错误是"Cannot convert source type System.Collections.Generic.ICollection&lt;LabManager.DataAccess.Cylinder&gt;' to target type 'System.Collections.Generic.ICollection&lt;LabManager.BusinessObjects.BusinessObjects.Cylinder&gt;' 这仍然是命名空间问题吗?
  • 完全限定参数的类型。
  • 是的,同样的问题。但是,您需要为 entity.Cylinders 类编写一个转换方法——名称与 Lab 对象中的 Cylinders 属性相同,但它们实际上是完全不同的对象。 EF 可能已经为您创建了转换器;否则,您必须创建一个新的 BusinessObjects.Cylinder 并从 DataAccess.Cylinder 中一一分配属性。
  • 你能提供一个转换方法的例子吗?我检查了 DataAccess 中的 Cylinder 类是单数,而在 DataAccess.Lab 类中,属性名称是复数。这还不够明显吗?
  • @StevenWestbrook OHHHHHH 我刚刚看到你所说的气缸相同但不同的意思。我又读了一遍错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多