繁体   English   中英

首先在哪里编写EF6代码的自定义数据访问方法

[英]Where to write custom data access method for EF6 code first

我首先在数据访问层使用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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM