Динамически установить источник данных в EF

Я использую EF6, и у меня есть 2 разные версии баз данных (MsSQL). 1 версия имеет таблицу Person, а другая - нет. Я переопределяюOnModelCreating и я использую modelBuilder.Ignore<Person>();Это работает для вызова базы данных для других таблиц. Что я хотел бы сделать, так это то, что когда я вызываю сущность через EF, она возвращает новый экземпляр класса Person вместо попытки соединиться с БД и получить ее данные.

например:

using(MyEntity ent = new MyEntity("connectionString")
{
  var myPerson = ent.Person.FirstOrDefault(); ==> Depending on version, return the DBData or new Person()
}

1 ответ

Решение

Я предполагаю, что вы можете добавить логический параметр в конструктор вашего контекста:

public MyEntity(string connectionString, bool includePerson)
{
    _includePersion = includePerson;
}

Теперь контекст может иметь свойство Personили предпочтительно форма множественного числа People:

public IQueryable<Person> People
{
    get => _includePerson 
        ? Set<Person>()
        : (new[] { new Person() }).AsQueryable();
}

Технически вы должны быть вне леса сейчас, потому что нет никаких навигационных свойств в / из Person, Тем не менее, я боюсь, что эта конструкция может иметь больше последствий вниз по течению, чем можно ожидать на первый взгляд. Я приложил бы все усилия, чтобы избежать этого. Добавление пустого Person таблица с базами данных без нее была бы намного лучше. Это может сделать даже само приложение, при условии, что вошедший в систему пользователь базы данных имеет необходимые разрешения DDL.

Другие вопросы по тегам