Использование автозаполнения для сохранения ссылки на внешний ключ или создания нового объекта, если это новый элемент - PullRequest
1 голос
/ 15 ноября 2011

У меня есть три поля, которые называются Страна, Отдел и Город.

enter image description here

В моей базе данных есть три таблицы, в которые может напечатать пользователь. Библиотека автозаполнения jQuery позволяет пользователям вводить имена и заполнять их. Я хочу, чтобы мои пользователи выбирали из существующих стран / департаментов / городов, а также позволяли им создавать совершенно новые предметы, если они не могут выбирать.

Country     Department     City
----------  ----------     ---------
CountryId   DepartmentId   CityId
Name        Name           Name
            CountryId      DepartmentId

Я с трудом пытаюсь понять этот, казалось бы, простой процесс.

Вот мой код:

EFRegistryCountryRepository registryCountryRepository = new EFRegistryCountryRepository();
var country = registryCountryRepository.FindAllRegistryCountries().SingleOrDefault(c => c.Name == model.Country);
if (country == null)
{
    RegistryCountry newCountry = new RegistryCountry();
    newCountry.Name = model.Country;
    registryCountryRepository.AddRegistryCountry(newCountry);
    registryCountryRepository.SaveChanges();
}

EFRegistryDepartmentRepository registryDepartmentRepository = new EFRegistryDepartmentRepository();
var department = registryDepartmentRepository.FindAllRegistryDepartments().SingleOrDefault(d => d.Name == model.Department && d.RegistryCountry.Name == model.Country);
if (department == null)
{
    RegistryDepartment newDepartment = new RegistryDepartment();
    newDepartment.RegistryCountryId = country.RegistryCountryId;
    newDepartment.Name = model.Department;
    registryDepartmentRepository.AddRegistryDepartment(newDepartment);
    registryDepartmentRepository.SaveChanges();
}

EFRegistryCityRepository registryCityRepository = new EFRegistryCityRepository();
var city = registryCityRepository.FindAllRegistryCities().SingleOrDefault(d => d.Name == model.City);
if (city == null)
{
    RegistryCity newCity = new RegistryCity();
    newCity.RegistryDepartmentId = department.RegistryDepartmentId;
    newCity.Name = model.City;
    registryCityRepository.AddRegistryCities(newCity);
    registryCityRepository.SaveChanges();
}

Прежде всего, есть проблема, если Страна не существует, я не могу получить доступ к этой недавно созданной Стране из бита кода Департамента, поскольку она объявлена ​​в условии if (country == null).

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

1 Ответ

0 голосов
/ 15 ноября 2011

возможно, я смотрю на ваш вопрос несколько упрощенно или не понял вашу основную идею, но вы должны иметь возможность установить переменную вне if для внутренней переменной после того, как вы сохранили элемент, EntityFramework заполнит ваш Поле Id со значением Identity из БД, так, например, для страны бит вашего кода может быть:

var country = registryCountryRepository.FindAllRegistryCountries().SingleOrDefault(c => c.Name == model.Country);
if (country == null) 
{ 
    RegistryCountry newCountry = new RegistryCountry(); 
    newCountry.Name = model.Country; 
    registryCountryRepository.AddRegistryCountry(newCountry); 
    registryCountryRepository.SaveChanges(); 
    **country = newCountry**
} 

это позволит вам использовать объект страны для проверки CountryId в Департаменте If, и вы можете использовать тот же процесс внутри Департамента If для использования в городе If

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...