Как я могу получить доступ / изменить объекты в базе данных, используя внешние ключи? - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь получить доступ к сущностям из базы данных для обеспечения целостности данных при внесении изменений в мою базу данных.

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

Класс «Мой ребенок» выглядит следующим образом,

public string Name { get; set; }
public decimal Balance { get; set; }    

public int AccountTypeId { get; set; }
public virtual AccountType AccountType { get; set; }    

и соответствующий родитель,

public string Name { get; set; }

public virtual ICollection<Account> Accounts = new ICollection<Account>()

Я использую шаблоны единиц работы и репозитория для доступа к данным, поэтому в моем классе тестирования я делаю следующее:

(uow = new UnitOfWork)

AccountType accountType1 = new AccountType() { Name = "Bank" };
AccountType accountType2 = new AccountType() { Name = "Loan" };

uow.AccountTypes.Add(accountType1);
uow.AccountTypes.Add(accountType2);
uow.Commit();

Account account1 = new Account() { Name = "RBS", Balance = 20, AccountTypeId = 1 };

uow.Accounts.Add(account1);
uow.Commit();

Однако при попытке доступа к свойству AccountType в account1 это не удается, я попытался установить для AccountType ссылку accountType1, однако, когда дело доходит до изменения AccountType с одного на другой, он требует, чтобы я загружал новый accountType из базы данных и затем назначал его Account, каждый раз, когда я делаю это изменение, вместо простого изменения Foreign key. Разве нет способа изменить ассоциации через Foreign Key и все же разрешить lazy loading? Или мне нужно предоставить собственный запрос, используя Foreign Key в таблице родительских сущностей?

Спасибо!

Редактировать

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

1 Ответ

0 голосов
/ 03 июля 2018

Вам необходимо назначить ссылку на родителя для каждого дочернего элемента, например:

 (uow = new UnitOfWork)
    AccountType accountType1 = new AccountType() { Name = "Bank" };
    uow.AccountTypes.Add(accountType1);

Account account1 = new Account() { 
Name = "RBS", 
Balance = 20, 
AccountTypeId = 1 
AccountType = accountType1
};

uow.Accounts.Add(account1);
uow.Commit();

Также вам не нужно фиксировать во многих местах одну транзакцию

...