实体框架6将自定义SQL查询映射到实体

时间:2018-02-05 20:47:00

标签: c# asp.net-mvc entity-framework entity-framework-6

我目前对ASP.NET MVC和Entity Framework很陌生。我现在已经和它一起工作了大约3个月。

我有一个运行Entity Framework 6的ASP.NET MVC 5应用程序。这是来自现有数据库的代码优先方法,启用了自动迁移,因此我的所有Entity类都是自动生成的。我正在尝试向我的MVC应用程序添加一个返回特定结果集的视图。目前,以前的开发人员将应用程序设置为仅接受Entity类以向DataTable DataTables.net显示数据。进一步澄清:

我的模型中有两个实体表,它们是MySQL中的表。

| Samples           | SampleLocation |
|:------------------|---------------:|
| Id                |     LocationId |        
| DateAssigned      |           Name |      
| CheckedInDate     |           Size |         
| SampleLocationId  |                |        
| ...etc            |         ...etc |          

我想要完成的是查询两个表并将结果返回到视图中的MVC应用程序。从那里运行Update并更新Samples表中的几列。下面是返回我需要的结果的粗略查询。

SELECT Samples.Id, samples.CheckedInDate, SampleLocation.Name, SampleLocation.Size, 
SampleLocation.LocationId 
FROM (Samples join SampleLocation 
ON ((Samples.SampleLocationId = SampleLocation.LocationId))) 
WHERE  isnull(samples.CheckedInDate) ORDER BY samples.Id

从我所做的研究中,有几种方法可以实现这一目标。我试过的方法会给我一个我可以使用的类是创建一个存储过程然后更新模型 - 这会破坏模型并取消映射模型中的每个实体。我已经尝试使用查询创建一个视图以添加到模型中 - 但是这也会打破它并取消映射所有内容。我后来发现这是一个错误。

所以我的问题是,如何将查询映射到将结果返回到视图的实体?有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:0)

有几种方法可以完成您想要做的事情,只使用实体框架或额外的工具,如Dapper

仅限实体框架:

首先,您可以使用Linq来提取数据,我看起来像这样:

var list = from s in Samples
           join l in SampleLocations
               on s.Id equals l.LocationId
           where s.CheckedInDate == null
           select new
           {
                s.Id,
                s.CheckedInDate,
                l.Name,
                l.Size, 
                l.LocationId 
           };

<强>小巧玲珑:

第二种方法是使用dapper,这里唯一真正的区别是你会直接使用你的查询,所以你没有使用linq这样的东西:

Connection.Query(@"SELECT Samples.Id, samples.CheckedInDate,  
                     SampleLocation.Name, SampleLocation.Size, 
                     SampleLocation.LocationId 
                   FROM Samples
                     join SampleLocation 
                       ON Samples.SampleLocationId = SampleLocation.LocationId
                   WHERE isnull(samples.CheckedInDate) ORDER BY samples.Id");

对于两者:

在您的更新方法中,您首先必须检索实体,因为您可以使用DbSet.Find方法或其他查询,然后调用DbConext.SaveChanges

答案 1 :(得分:0)

这是我的问题的解决方案。基本上在XML中手动创建实体并将其映射到虚拟表。Entity Framework DefiningQuery