【问题标题】:Using an SQL View from an Entity Framework Code First version 5使用实体框架 Code First 版本 5 中的 SQL 视图
【发布时间】:2013-09-03 15:03:58
【问题描述】:

我正在使用 VS 2010、MVC3 和 EF 5 在网站中开发联系人日志 - 实体首先使用代码创建。数据存储在一组 SQL Server 2008 R2 数据库中。我想显示联系人日志的摘要并创建了一个视图。

CREATE VIEW dbo.ContactLogSummaries

AS

SELECT
    CLE.ContactLogEntryID,
    CLE.CaseID,
    'Test' AS ContactName,
    EU.UserName As OfficeUser,
    CLE.DateAndTimeOfContact,
    CLC.Category,
    CLE.ContactDetails

FROM
    ContactLogEntries AS CLE
    JOIN
    ContactLogCategories AS CLC
    ON CLE.ContactLogCategoryID = CLC.ContactLogCategoryID
    JOIN
    Control.dbo.EndUsers AS EU
    ON CLE.UserID = EU.EnduserID

联系人日志数据库中有两个实体(ContactLogEntriesContactLogCategories)和另一个数据库中的数据库第一个实体 Control.dbo.EndUsers。联系日志可能包含大量记录。我希望能够只显示特定案例的记录。

我的问题分为两部分:

  1. 能否直接使用 SQL 视图在网页上显示摘要(可能通过将其读入类)
  2. 我能否创建一个与 SQL 视图等效的代码优先对象。

【问题讨论】:

    标签: c# asp.net-mvc-3 sql-server-2008 entity-framework-5


    【解决方案1】:

    您可以使用 TableAttribute(数据注释)或 Fluent Mappings 中的 ToTable 将实体直接映射到视图...

    例如使用数据注解:

    using System;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    
    public namespace whatever.mynamespace
    
        [Table("dbo.ContactLogSummaries")] //<-- this is your view
        public class ContactLogSummary
        {
            ...
        }
    }
    

    【讨论】:

      【解决方案2】:

      找到问题1的简单解决方案:

      public class ContactLogSummary
      {
          public int ContactLogEntryID { get; set; }
          public int MaternalCaseID { get; set; }
          public String ContactName { get; set; }
          public String OfficeUser { get; set; }
          public DateTime DateAndTimeOfContact { get; set; }
          public String Category { get; set; }
          public String ContactDetails { get; set; }
      
          public static List<ContactLogSummary> LoadContactListSummary
                                                   (int caseID, String connectionString);
          {
              MyDataContext dbContext = new MyDataContext(connectionString);
              return dbContext.Database.SqlQuery<ContactLogSummary>
                     ("SELECT * FROM dbo.ContactLogSummaries WHERE MaternalCaseID = @CaseID ORDER BY ContactLogEntryID DESC",
                                           new SqlParameter("CaseID", caseID)).ToList();
          }
      

      它完成了所有要求,尽管我对问题 2 的答案感兴趣,但我有一个可行的解决方案。

      【讨论】:

      • 没有什么比字符串连接更能说明 SQL 注入了!
      • 这里没有 SQL 注入。一 - 这是一个说明性示例;二、CaseID不从网站返回。请问我可以拿回我的加一吗?
      • Peter - 我可以理解这段代码本质上是说明性的,但是,读者无法知道 CaseID 是否来自发布到表单的内容(例如,编辑,或来自查询字符串)。如果你参数化字符串,我会把你的加号放回去。它会使您的代码更长一点,但是,它将成为社区的可靠示例。它还将允许 SQL Server 为该查询创建一个执行计划以供后续重用。
      • @SwampyFox 好的,终于可以为查询添加一个参数了。 (请问我可以拿回我的加号吗?)
      • @MonojitSarkar 您应该像 Entity Framework 那样添加参数:@p0@p1 等。您可以使用 params 重载:dbContext.Database.SqlQuery&lt;ContactLogSummary&gt;("SELECT * FROM dbo.ContactLogSummaries WHERE MaternalCaseID = @p0 AND TestID = @p1 ORDER BY ContactLogEntryID DESC", caseId, testId)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      相关资源
      最近更新 更多