4

我想使用 Code-FirstDropCreateDatabaseAlwaysDropCreateDatabaseIfModelChanges功能,因为我围绕该功能构建了许多集成测试。有没有比创建表、删除表、然后使用 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"); 
    }
4

1 回答 1

2

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

于 2011-03-19T10:07:35.547 回答