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