无法在 linq to entity 查询中构造实体或复杂类型“x”

Posted

技术标签:

【中文标题】无法在 linq to entity 查询中构造实体或复杂类型“x”【英文标题】:the entity or complex type 'x' cannot be constructed in a linq to entities query 【发布时间】:2015-07-06 00:55:31 【问题描述】:

谁能告诉我以下代码有什么问题,因为我在运行时在主题中收到此错误:

我的具体 DAL:

public class CustomerDal : ICustomerDal

    public List<CustomerDto> Fetch()
    
        using(var ctx = DbContextManager<CustomerContext>.GetManager("CustomerDB"))
        
            var result = from r in ctx.DbContext.Customers 
                         select new CustomerDto
                         
                             CustomerId = r.CustomerId,
                             Name = r.Name,
                             Email = r.Email
                         

            return result.ToList();
        
    

我的数据上下文:

public class CustomerContext : DbContext

    public CustomerContext(string connectionName)
        : base(connectionName)
    
    

    public DbSet<CustomerDto> Customers  get; set; 

我的 DTO:

public class CustomerDto

    [Key]
    public int CustomerId  get; set; 
    public string Name  get; set; 
    public string Email  get; set; 

该数据库是一个名为 CustomerDB 的 LocalDb 数据库,以及一个名为 Customer 的表,其中包含 CustomerId、Name 和 Email 列。

我确实注意到,如果我使用匿名函数将 DAL 代码更改为以下代码,它可以正常运行,但我仍然没有从数据库中获取任何数据:

    public List<CustomerDto> Fetch()
    
        using(var ctx = DbContextManager<CustomerContext>.GetManager("CustomerDB"))
        
            var result = (from r in ctx.DbContext.Customers 
                         select new 
                         
                             CustomerId = r.CustomerId,
                             Name = r.Name,
                             Email = r.Email
                         ).ToList().Select(x => new CustomerDto CustomerId = x.CustomerId, Name = x.Name, Email = x.Email );

            return result.ToList();
        
    

我也在使用 CSLA 框架,但这对这件事没有任何影响。

我看到论坛中有类似的问题,因为我使用的是 DTO(我发现的所有问题从一开始都没有使用),所以没有一个能真正 100% 回答我的问题。

任何帮助将不胜感激。

谢谢, 彼得

【问题讨论】:

问题主要是linqtoentities不支持整个linq功能。如果您想做与 dto 类似的事情,...您需要执行 ToList() 然后选择 dto。对于使用方法的复杂机制也是如此(即使是 linq 通常支持的一些内置方法也会导致相同的错误) 除了正常我会说你的“anynymous”代码应该会产生结果。如果 (from r in ctx.DbContext.Customers select r).ToList() 没有任何结果,您是否也尝试过调试? 不完全(可能是因为这个,我的措辞有点糟糕)。顺便说一句,我刚刚看到您在 dto 中使用 [Key]?如果仍然抛出错误,您是否已经尝试删除它? (据我阅读 EF 使用的关键注释,因此可能导致 EF 错误地解释 customerDto 是一个实体) @Thomas,如果我删除 [Key]-attribute 我会在'return result.ToList()'之前收到以下错误:“在模型生成期间检测到一个或多个验证错误:CSLAEFCodeFirstTest .DalEf.CustomerDto: : EntityType 'CustomerDto' 没有定义键。为此 EntityType.Customers 定义键:EntityType: EntitySet 'Customers' 基于没有定义键的类型 'CustomerDto' ..我也意识到我在第一个例子中没有得到任何数据。它通过查询但在'return result.ToList()'处停止。我错过了什么? 【参考方案1】:

您可以让您的 CustomerDto 派生自 Customer...

public class CustomerDto : Customer  

public List<CustomerDto> Fetch(int categoryID)

    return (from p in db.Products
            select new CustomerDto()
            
                CustomerId = r.CustomerId,
                Name = r.Name,
                Email = r.Email
            ).ToList();

【讨论】:

另外,我不想从 Customer 继承,因为我想使用类似于数据库中表的“纯”Dto,并且只是一个数据载体。

以上是关于无法在 linq to entity 查询中构造实体或复杂类型“x”的主要内容,如果未能解决你的问题,请参考以下文章

在 LINQ to Entities 查询中无法构造实体或复杂类型

在 LINQ to Entities 查询中无法构造实体或复杂类型“Cits.Data.LineImg”。

LINQ To Entities 无法识别方法 Last。真的吗?

LINQ To Entities 无法识别方法 Last。真的吗?

LINQ to Entities 无法识别该方法

LINQ to Entities 无法识别方法“System.Object GetValue(...)”