gpt4 book ai didi

c# - 将数据库 View 映射到 EF 5.0 Code First w/Migrations

转载 作者:太空狗 更新时间:2023-10-29 18:12:02 26 4
gpt4 key购买 nike

我正在尝试将 SQL View 映射到 EF 5.0 Code First w/Migrations 中的实体,以便在页面上显示一些基本信息,而无需查询多个表来获取该信息(目前加载需要大约 20 秒。 不好。)。我听说可以这样做,但我一直无法弄清楚或在网上找到正确的方法。

编辑:要更深入地了解我对这个问题的解决方案,请阅读 this blog post关于这个问题。

这是我的看法:

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);
}

所有这些都给我以下错误:

数据库中已经有一个名为“ClientStatistics”的对象。

我做错了什么?我有什么办法可以做到这一点,还是我应该做其他事情?

最佳答案

您已指定 ClientStatisticsView 实体应映射到名为“ClientStatistics”的表。因此 Entity Framework 将生成一个包含创建该表的指令的迁移。但是您已经在数据库中独立创建了该 View ,因此为防止出现错误,您应该从 Up 迁移中删除 CreateTable 指令。

我认为更好的方法是通过像这样运行 sql 在迁移中创建 View :

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)")
}

这样你的 View 和表就在一个地方指定,你可以安全地上下迁移

引用

http://elegantcode.com/2012/04/12/entity-framework-migrations-tips/

关于c# - 将数据库 View 映射到 EF 5.0 Code First w/Migrations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20862807/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com