我想使用Code-First的DropCreate
DatabaseAlways和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表接收来自条形码扫描器的输入.工人刷卡并注册当天.即使扫描时Worker表中没有相应的记录,客户端也要求记录Signin.由于客户端的要求,我计划使用我可以控制的ID作为主键,并以编程方式或尽可能与视图关联barcodenumber.
SigninView将来自Person,Worker和Signin表的信息组合在一起显示在其中刷ID的网页上.我假设一个SQL服务器视图比我的C#关联3个表值的数据更快. (我觉得我没时间停下来测试一下).
所以…我想要做的是附加到视图.我可以使用DbSet<>附加到视图,但我在开发应用程序时也使用CodeFirst重新创建表结构.
现在我有一个kludge,其中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");
}
最佳答案 代码首先当前不支持数据库视图所以如果你想使用重新创建数据库,你必须使用你的方法,自定义linq查询与投影到数据类型(这是常见的方法)或SqlQuery直接执行你的SELECT.