entity-framework – 如何告诉EF / DbSet附加到SQL视图而不是尝试创建具有相同名称的表?

我想使用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.

点赞