如何使用外键访问/修改数据库中的实体?

时间:2018-07-03 09:45:20

标签: c# entity-framework relational-database lazy-loading

我正在尝试从数据库访问实体,以确保在对数据库进行更改时确保数据完整性。

我正在测试改变外键/导航属性以指向关联表中不同行的不同方法。

我的孩子班级看起来像这样,

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的{​​{1}}属性时失败了,我尝试将account1设置为对AccountType的引用,但是当涉及到将accountType1从一个更改为另一个,每次我进行此更改时,都需要我从数据库中加载新的AccountType,然后将其分配给accountType,而不是简单地Account的更改。是否无法通过Foreign key更改关联并仍然允许Foreign Key?还是我需要使用父实体表上的lazy loading提供自己的查询?

谢谢!

修改

如果我创建实体并将它们全部保存在一个上下文中,然后尝试访问Navigation属性,则此方法有效,但是,如果我处理上下文,然后在新的上下文中执行查询,则它将无法加载信息。

1 个答案:

答案 0 :(得分:0)

您需要将父级引用分配给每个子项,例如:

 (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();

此外,您无需在很多地方进行一项交易