如何使Readity实体框架数据上下文

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使Readity实体框架数据上下文相关的知识,希望对你有一定的参考价值。

我需要向第三方插件公开实体框架数据上下文。目的是允许这些插件仅获取数据,而不是让它们发出插入,更新或删除或任何其他数据库修改命令。因此,我如何只读取数据上下文或实体。

答案

除了与只读用户连接外,还可以对DbContext执行一些其他操作。

public class MyReadOnlyContext : DbContext
{
    // Use ReadOnlyConnectionString from App/Web.config
    public MyContext()
        : base("Name=ReadOnlyConnectionString")
    {
    }

    // Don't expose Add(), Remove(), etc.
    public DbQuery<Customer> Customers
    {
        get
        {
            // Don't track changes to query results
            return Set<Customer>().AsNoTracking();
        }
    }

    public override int SaveChanges()
    {
        // Throw if they try to call this
        throw new InvalidOperationException("This context is read-only.");
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Need this since there is no DbSet<Customer> property
        modelBuilder.Entity<Customer>();
    }
}
另一答案

与接受的答案相反,我认为favor composition over inheritance会更好。然后就不需要保存诸如SaveChanges之类的方法来抛出异常。而且,为什么你首先需要这样的方法呢?你应该设计一个类,使消费者在查看其方法列表时不会被愚弄。公共接口应该与类的实际意图和目标一致,而在接受的答案中,SaveChanges并不意味着Context是只读的。

在我需要具有只读上下文的地方,例如在CQRS模式的Read端,我使用以下实现。除了向其消费者提供查询功能之外,它不提供任何其他功能。

public class ReadOnlyDataContext
{
    private readonly DbContext _dbContext;

    public ReadOnlyDataContext(DbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public IQueryable<TEntity> Set<TEntity>() where TEntity : class
    {
        return _dbContext.Set<TEntity>().AsNoTracking();
    }

    public void Dispose()
    {
        _dbContext.Dispose();
    }
}

通过使用ReadOnlyDataContext,您只能访问DbContext的查询功能。假设您有一个名为Order的实体,那么您将以下面的方式使用ReadOnlyDataContext实例。

readOnlyDataContext.Set<Order>().Where(q=> q.Status==OrderStatus.Delivered).ToArray();

以上是关于如何使Readity实体框架数据上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何首先使用实体​​框架代码更新一行?

映射不区分大小写 - 代码优先 - 实体框架

仅实体框架代码错误:支持上下文的模型自创建数据库以来已更改

是否需要处理实体框架上下文对象

使用实体框架、代码优先和 CRUD 操作的存储库模式

如何刷新实体框架核心 DBContext?