我想使用 Code-FirstDropCreateDatabaseAlways
和DropCreateDatabaseIfModelChanges
功能,因为我围绕该功能构建了许多集成测试。有没有比创建表、删除表、然后使用 sql 命令创建视图更优雅的附加到 SQL 视图的方法?
[使用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 的关系中。总会有一个人;可能没有工人记录。
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 表接收来自条形码扫描仪的输入。工人们刷卡登记当天。客户端要求记录Signin,即使扫描时Worker表中没有对应的记录。由于客户的要求,我计划使用我可以控制的 ID 作为主键,并以编程方式或尽可能与视图关联条形码编号。
SigninView 结合了来自 Person、Worker 和 Signin 表的信息,以显示在 ID 被刷卡的网页上。我假设 SQL 服务器视图比我的 C# 关联 3 个表的数据的视图更快。(我觉得我没有时间停下来测试一下)。
所以......我想要做的是附加到视图。我可以使用 DbSet<> 附加到视图,但我也在开发应用程序时使用 CodeFirst 重新创建我的表结构。
现在我有一个问题,其中 Code-First 创建了一个表 SigninView,然后删除它并使用 SqlCommands 创建视图:
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");
}