在哪里首先为EF6代码编写自定义数据访问方法
本文关键字:自定义 数据 访问 方法 代码 EF6 在哪里 | 更新日期: 2023-09-27 18:25:51
我首先使用Entity Framework 6代码作为数据访问层。
据我所知,从版本6开始,DbContext
实现了工作单元模式,每个DbSet
实现了存储库模式。
在这种情况下,自定义访问方法应该放在这个体系结构中的什么位置。对实体运行查询的方法。
作为参考,我的数据上下文类看起来像:
public class DatabaseContext : DbContext
{
public DatabaseContext() : base("DatabaseContext ")
{
}
public virtual DbSet<Account> Account { get; set; }
public virtual DbSet<Country> Country { get; set; }
etc...
}
我的实体通常采用以下形式:
public class Account
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int AccountId { get; set; }
[Required]
[MaxLength(255)]
public string Name { get; set; }
etc...
}
我的猜测是,这些方法将进入实体类本身,这将允许我以DataContext.Account.GetAccountById
的形式访问它们(例如):
public class Account
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int AccountId { get; set; }
[Required]
[MaxLength(255)]
public string Name { get; set; }
public Account GetAccountById(int accountId)
{
// but how do I get the data context?
}
}
当然,这个问题是我无法从实体内部访问DataContext。
有人能提出建议吗?
编辑
我已经提出了这个方法,它允许我访问DbContext并模拟调用。有人能证实这是否合理吗?
public class AccountDbSet<T> : DbSet<T> where T : class
{
public virtual T GetAccountById(int id)
{
return this.Find(id);
}
}
然后是数据上下文:
public class DatabaseContext : DbContext
{
public DatabaseContext () : base("DatabaseContext ")
{
}
public virtual AccountDbSet<Account> Account { get; set; }
etc...
}
我不知道是否有内置的EntityFramework功能可以做到这一点,但一般来说,谈论C#,你可以创建一个扩展类:
public static class EntityFrameworkExtensions
{
public static Account GetAccountById(this DbSet<Account> dbSet, int accountId)
{
return dbSet.Find(accountId);
// or dbSet.FirstOrDefault(x => x.Id == accountId) for non-primary key columns
}
}
然后,在代码中的某个位置:
int id = DataContext.Account.GetAccountById(5);