gpt4 book ai didi

entity-framework - 如何告诉 EF/DbSet 附加到 SQL View 而不尝试创建同名表?

转载 作者:行者123 更新时间:2023-12-01 04:12:33 25 4
gpt4 key购买 nike

我想使用 Code-First 的 DropCreateDatabaseAlwaysDropCreateDatabaseIfModelChanges功能,因为我围绕该功能构建了许多集成测试。是否有比创建表、删除表然后使用 sql 命令创建 View 更优雅的附加到 SQL View 的想法?

[使用VS2010 Professional、ASP.NET 4、MVC3、EF4、SQL Server 2008 R2 Express、Win7]

public MyContext : DbContext {
public DbSet<Person> Persons {get; set;}
public DbSet<Worker> Workers {get; set;}
public DbSet<Signin> Signins {get; set;}
public DbSet<SigninView> SigninView {get; set;}
}
public class Person
{
public int ID { get; set; }
public virtual Worker Worker { get; set; }
}
public class Worker
{
public int ID { get; set; }
public int barcodenumber {get; set;}
public virtual Person Person { get; set; }
public virtual ICollection<WorkerSignin> workersignins { get; set; }
}
public class WorkerSignin
{
public int ID { get; set; }
public virtual Worker worker {get; set;}
public int barcodenumber {get; set;}
}

Person.ID == Worker.ID。他们处于 1 对 0..1 的关系中。总会有一个人;可能没有 worker 记录。
public class PersonBuilder : EntityTypeConfiguration<Person>
{
public PersonBuilder()
{
ToTable("Persons");
HasKey(k => k.ID);
HasOptional(p => p.Worker).WithRequired().WillCascadeOnDelete();
}
}
public class WorkerBuilder : EntityTypeConfiguration<Worker>
{
public WorkerBuilder()
{
HasKey(k => k.ID);
HasMany(s => s.workersignins)
.WithOptional(s => s.worker)
.HasForeignKey(s => s.WorkerID);
}
}

Signin 表接收来自条形码扫描仪的输入。 worker 刷卡并登记当天。 即使在扫描时 Worker 表中没有相应的记录,客户端也要求记录 Signin。 由于客户的要求,我计划使用我可以控制的 ID 作为主键,并以编程方式或尽可能与 View 相关联。

SigninView 结合了来自 Person、Worker 和 Signin 表的信息,以显示在 ID 被刷过的网页上。我假设 SQL 服务器 View 将比我的 C# 关联 3 个表的数据更快。 (我觉得我没有时间停下来测试这个)。

所以......我想要做的是附加到 View 。我可以使用 DbSet<> 附加到 View ,但我也在开发应用程序时使用 CodeFirst 重新创建我的表结构。

现在我有一个问题,Code-First 创建一个表 SigninView,然后删除它并使用 SqlCommands 创建 View :
public class MyInitializer : DropCreateDatabaseIfModelChanges<MyContext>
{

protected override void Seed(MyContext myDB)
{
myDB.Database.SqlCommand(@"drop table machete.dbo.WorkerSigninView");
myDB.Database.SqlCommand(@"CREATE VIEW [dbo].[WorkerSigninView]
AS
SELECT dbo.WorkerSignins.ID, dbo.WorkerSignins.barcodenumber
FROM dbo.Persons INNER JOIN
dbo.Workers ON dbo.Persons.ID = dbo.Workers.ID RIGHT OUTER JOIN
dbo.WorkerSignins ON dbo.Workers.barcodenumber = dbo.WorkerSignins.barcodenumber");
}

最佳答案

Code First 目前不支持数据库 View ,因此如果您想使用重新创建数据库,您必须使用您的方法,自定义 linq 查询并投影到数据类型(这是常见方法)或 SqlQuery直接执行您的 SELECT。

关于entity-framework - 如何告诉 EF/DbSet 附加到 SQL View 而不尝试创建同名表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5359172/

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