【问题标题】:Bind the SQL data to model property in Entity Framework将 SQL 数据绑定到实体框架中的模型属性
【发布时间】:2016-10-11 03:06:01
【问题描述】:

祝你有美好的一天。我从 SQL 存储过程返回一个结果。

现在我将数据绑定如下。

 List<EventPhotos> resList = null;
 resList = pe.Database.SqlQuery<EventPhotos>(sqlQuery, param).ToList();

以下是我的模型。

public partial class EventPhotos
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public EventPhotos()
        {

        }        

        public EventInfo EventInformation { get; set; }
        public ImageInfo ImageInformation { get; set; }

    }

    public class EventInfo
    {
        public string EventID { get; set; }

        public string EventName { get; set; }

        public bool IsJoint { get; set; }
    }
    public class ImageInfo
    {
        public string ImageID { get; set; }

        public string EventMediaFolder { get; set; }

        public string Image { get; set; }

        public string DateTime { get; set; }

        public string ImageDescription { get; set; }

        public string Action { get; set; }
    }

但是当我运行它时,没有任何东西被映射到我的属性 EventInformation 和 ImageInformation。有没有办法做到这一点。我知道如果我们使用 dataAdapter 并为检索到的每个表分配名称,就可以做到这一点。但我想使用实体框架。任何帮助表示赞赏。提前致谢。

【问题讨论】:

  • 您好,感谢您的回复。但那是为了提供参数。就我而言,数据都很好。如果我使用具有属性的单个类,我将获取数据。现在的问题是,当我拆分为单独类的两个属性时,它不会自动映射。
  • 为什么使用原始 SQL 查询而不是 linq?
  • 我使用的与您提供的链接中的示例相同。谢谢
  • 谢谢,是的,我正在调用存储过程。我在我的问题中提到了它:)

标签: c# sql entity-framework linq stored-procedures


【解决方案1】:

Database.SqlQuery:

创建将返回给定类型元素的原始 SQL 查询。 类型可以是任何具有匹配名称的属性的类型 从查询返回的列,或者可以是一个简单的原语 类型。该类型不必是实体类型。这个结果 查询永远不会被上下文跟踪,即使对象的类型 返回的是一个实体类型。

这意味着,存储过程的结果集的列名必须与 POCO 类EventPhotos 中定义的属性名称匹配。因此,您必须使用返回的列的确切名称创建类 EventPhotos,而不是添加两个属性 - Database.SqlQuery 方法无法找到嵌套的属性名称。

SqlQuery 不支持复杂类型。

See a similar question here.

【讨论】:

    【解决方案2】:

    尝试添加表和列属性

    public class EventInfo
    {
    
        [Column(Name = "EventID")]
        public string EventID { get; set; }
    
    
        [Column(Name = "EventName")]
        public string EventName { get; set; }
    
    
        [Column(Name = "IsJoint")]
        public bool IsJoint { get; set; }
    }
    public class ImageInfo
    {
    
        [Column(Name = "ImageID" )]
        public string ImageID { get; set; }
    
    
        [Column(Name = "EventMediaFolder")]
        public string EventMediaFolder { get; set; }
    
    
        [Column(Name = "Image")]
        public string Image { get; set; }
    
    
        [Column(Name = "DateTime")]
        public string DateTime { get; set; }
    
    
        [Column(Name = "ImageDescription")]
        public string ImageDescription { get; set; }
    
    
        [Column(Name = "Action")] 
        public string Action { get; set; }
    }
    

    我使用下面的代码来做映射

     returnItems = context.ExecuteQuery<EventPhotos>(sql).ToList();
    

    【讨论】:

    • 当我尝试这个时,我收到一个错误,因为名称不是有效的命名属性。知道如何解决这个问题吗?提前致谢
    • @Vojtěch Dohnal,真的回答了你的问题。属性中的列名和表名都需要与SQL查询的列名匹配。
    • 我在选择查询中使用属性名称。当我使用具有所有属性的单个类时,它正在工作。
    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多