Как я могу сказать EF / DbSet присоединиться к SQL View и не пытаться создать таблицу с тем же именем? - PullRequest
4 голосов
/ 19 марта 2011

Я хотел бы использовать функции Code-First DropCreateDatabaseAlways и 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);
    }
}

Таблица входа получает данные от сканера штрих-кода.Рабочие смахивают карточку и регистрируются на день. Клиент требует, чтобы вход в систему был записан, даже если на момент сканирования нет соответствующей записи в рабочей таблице. Из-за требований клиента я планирую использовать идентификатор, которым я могу управлять в качествепервичный ключ, и коррелируйте штрихкод числа программно или с представлением, где это возможно.

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"); 
    }

1 Ответ

2 голосов
/ 19 марта 2011

Код сначала в настоящее время не поддерживает представления базы данных, поэтому, если вы хотите использовать пересоздание базы данных, вы должны использовать либо ваш подход, либо пользовательский запрос linq с проекцией на тип данных (это обычный подход), либо SqlQuery для выполнения вашегоВЫБРАТЬ напрямую.

...