使用实体框架代码中的SQL视图第一版本5

Pet*_*ith 7 c# sql-server-2008 asp.net-mvc-3 entity-framework-5

我正在使用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
Run Code Online (Sandbox Code Playgroud)

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

我的问题分为两部分:

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

Bra*_*don 23

您可以使用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
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ith 9

找到问题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();
    }
Run Code Online (Sandbox Code Playgroud)

它完成了所有必要的工作,虽然我对问题2的答案感兴趣,但我有一个有效的解决方案.

  • Peter - 我可以理解这段代码本质上是说明性的,但是,读者无法知道CaseID是否来自于发布到表单的内容(例如,编辑或来自查询字符串) .如果你参数化字符串,我会把你的加号.它会使你的代码更长一点,但是,它将成为社区的一个坚实的例子.它还允许SQL Server为此查询创建执行计划,以便后续重用. (4认同)
  • 没有什么比字符串连接更能说明SQL注入了! (2认同)