Iro*_*n84 9 c# entity-framework ef-code-first ef-migrations entity-framework-5
我正在尝试将SQL视图映射到EF 5.0 Code First w/Migrations中的实体,以便在页面上显示一些基本信息,而无需查询多个表以获取该信息(目前需要大约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
Run Code Online (Sandbox Code Playgroud)
这是实体:
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; }
}
Run Code Online (Sandbox Code Playgroud)
最后我的映射DbContext:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Entity<ClientStatisticsView>().ToTable("ClientStatistics");
base.OnModelCreating(modelBuilder);
}
Run Code Online (Sandbox Code Playgroud)
所有这些都给我以下错误:
There is already an object named 'ClientStatistics' in the database.
我究竟做错了什么?有没有办法让我做到这一点,或者我应该做其他事情呢?
Col*_*lin 14
您已指定该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)")
}
Run Code Online (Sandbox Code Playgroud)
这样您的视图和表格就可以在一个地方指定,您可以安全地上下移动
参考
http://elegantcode.com/2012/04/12/entity-framework-migrations-tips/