EF 5.0 Code First w / Migrations의 엔터티에 SQL 뷰를 매핑하여 해당 정보에 대해 여러 테이블을 쿼리 할 필요없이 페이지에 몇 가지 기본 정보를 표시하려고합니다 (현재로드하는 데 20 초 정도 걸립니다. 좋지 않습니다. ). 할 수 있다고 들었지만 온라인에서 제대로 할 수있는 방법을 알아 내거나 찾을 수 없었습니다.
편집 :이 문제에 대한 내 솔루션에 대한 자세한 내용을 보려면 주제에 대한 이 블로그 게시물 을 읽으십시오 .
내 견해는 다음과 같습니다.
CREATE VIEW [dbo].[ClientStatistics]
AS
SELECT ROW_NUMBER() OVER (Order By c.ID) as Row, c.LegacyID, c.ID, c.ClientName, slc.AccountManager, slc.Network,
(SELECT MAX(CreatedDate) AS Expr1
FROM dbo.DataPeriods
WHERE (ClientID = c.ID)) AS LastDataReceived,
(SELECT MAX(ApprovedDate) AS Expr1
FROM dbo.DataPeriods AS DataPeriods_2
WHERE (ClientID = c.ID)) AS LastApproved,
(SELECT MAX(ReportProcessedDate) AS Expr1
FROM dbo.DataPeriods AS DataPeriods_1
WHERE (ClientID = c.ID)) AS LastReportProcesssed
FROM dbo.Clients AS c INNER JOIN
dbo.SLClients AS slc ON c.ID = slc.ClientID
다음은 엔티티입니다.
public class ClientStatisticsView
{
[Key]
public int Row { get; set; }
public int LegacyID { get; set; }
public int ClientID { get; set; }
public string ClientName { get; set; }
public string AccountManager { get; set; }
public string Network { get; set; }
public DateTime LastDataReceived { get; set; }
public DateTime LastApproved { get; set; }
public DateTime LastReportProcessed { get; set; }
}
그리고 마지막으로 내 매핑 DbContext
:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Entity<ClientStatisticsView>().ToTable("ClientStatistics");
base.OnModelCreating(modelBuilder);
}
이 모든 것이 다음과 같은 오류를 발생시킵니다.
There is already an object named 'ClientStatistics' in the database.
내가 무엇을 잘못하고 있지? 이 작업을 수행 할 수있는 방법이 있습니까? 아니면 대신 다른 작업을해야합니까?
ClientStatisticsView
엔티티가 "ClientStatistics"라는 테이블에 매핑되도록 지정했습니다 . 따라서 엔터티 프레임 워크는 해당 테이블을 만드는 지침이 포함 된 마이그레이션을 생성합니다. 그러나 데이터베이스에서 해당 뷰를 독립적으로 만들었으므로 오류를 방지 CreateTable
하려면 Up
마이그레이션 에서 지침을 제거해야 합니다.
더 나은 방법은 다음과 같이 sql을 실행하여 마이그레이션에서 뷰를 만드는 것입니다.
public override void Up()
{
Sql("EXEC ('CREATE View [dbo].[ClientStatistics] AS --etc"
}
public override void Down()
{
Sql(@"IF EXISTS (SELECT
*
FROM sys.views
WHERE object_id = OBJECT_ID(N'dbo.ClientStatistics'))
DROP VIEW dbo.ClientStatistics)")
}
이렇게하면 뷰와 테이블이 한 곳에서 지정되고 안전하게 위아래로 마이그레이션 할 수 있습니다.
참고
http://elegantcode.com/2012/04/12/entity-framework-migrations-tips/
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다