执行以下操作时是否存在任何差异:
public class UsersContext : DbContext
{
public DbSet<User> Users { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
与使用Set<T>上下文的方法:
public class UsersContext : DbContext
{
}
var db = new UsersContext();
var users = db.Set<User>();
Run Code Online (Sandbox Code Playgroud)
这些有效地做了同样的事情,给了我一组用户,但是除了你没有通过属性暴露集合之外还有什么大的差异吗?
我先使用EF代码.此外,我正在为我的所有存储库使用基本存储库,并IUnitofWork注入存储库:
public interface IUnitOfWork : IDisposable
{
IDbSet<TEntity> Set<TEntity>() where TEntity : class;
int SaveChanges();
}
public class BaseRepository<T> where T : class
{
protected readonly DbContext _dbContext;
protected readonly IDbSet<T> _dbSet;
public BaseRepository(IUnitOfWork uow)
{
_dbContext = (DbContext)uow;
_dbSet = uow.Set<T>();
}
//other methods
}
Run Code Online (Sandbox Code Playgroud)
例如,我OrderRepository是这样的:
class OrderRepository: BaseRepository<Order>
{
IUnitOfWork _uow;
IDbSet<Order> _order;
public OrderRepository(IUnitOfWork uow)
: base(uow)
{
_uow = uow;
_order = _uow.Set<Order>();
}
//other methods
}
Run Code Online (Sandbox Code Playgroud)
我用这种方式使用它: …
我有一个关于MVC的项目.我们为数据库交易选择了EF.我们为BLL层创建了一些管理器.我找到了很多例子,其中使用了" using"语句,即
public Item GetItem(long itemId)
{
using (var db = new MyEntities())
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
}
Run Code Online (Sandbox Code Playgroud)
这里我们创建一个新的DBcontext实例MyEntities().我们使用" using"以"确保正确使用IDisposable对象".
这只是我经理中的一种方法.但我有十多个.每当我从管理器调用任何方法时,我将使用" using"statemant并在内存中创建另一个DBcontext.什么时候垃圾收集器(GC)会处理它们?谁知道?
但是还有另一种使用管理器方法的方法.我们创建一个全局变量:
private readonly MyEntities db = new MyEntities();
Run Code Online (Sandbox Code Playgroud)
并在没有" using"语句的每个方法中使用DBcontext .方法看起来像这样:
public Item GetItem(long itemId)
{
return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
问题:
usage"语句(因为它会影响性能)怎么办 - GC会为此做些什么呢?我是EF使用中的"新手",但仍然没有找到这个问题的明确答案.
c# garbage-collection entity-framework using-statement dbcontext
[HttpPost]
public ActionResult Edit(Movie movie)
{
if (ModelState.IsValid)
{
db.Entry(movie).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(movie);
}
Run Code Online (Sandbox Code Playgroud)
此操作接收电影模型并在数据库中更新它.
但我无法弄清楚如何.
该movie对象未附加到db,那么实体框架如何知道db中哪一行应该更新?
我确信Entry方法与它有关,但我真的不知道这个方法的作用.我读到它提供了信息,但是我无法理解如何只更改State一个条目,它将被附加和跟踪DBContext.
我想使用ExecuteStoreQueryEntity Framework的功能,我想知道我的上下文变量没有ExecuteStoreQuery方法.
所以,我发现它是一种ObjectContext类的方法,但我已经用于DbContext我的应用程序了.我根本就试图改变DbContext用ObjectContext,但它带来了一些错误(例如,在ObjectContext的不是OnModelCreating方法).
我如何使用ExecuteStoreQueryDbContext,如果我不能,是ExecuteStoreQueryDbContext的任何替代品?
所以我有一个执行工作流程的Windows服务流程.后端在Entity Framework之上使用Repository和UnitofWork Pattern and Unity,以及从edmx生成的实体类.我不会详细介绍它,因为它不是必需的,但基本上工作流程有5个步骤.特定过程可能在任何时间点的任何阶段(按当然顺序).第一步只生成第二步的数据,它通过长时间运行的进程验证数据到另一台服务器.然后步骤生成带有该数据的pdf.对于每个阶段,我们生成一个计时器,但是它可以配置为允许为每个阶段生成多个计时器.其中就是问题所在.当我将处理器添加到特定阶段时,它会随机出现以下错误:
连接没有关闭.连接的当前状态是连接.
阅读这一点似乎很明显,这种情况正在发生,因为上下文试图从两个线程访问同一个实体.但这就是让我陷入困境的地方.我可以在此找到的所有信息表明我们应该在每个线程中使用实例上下文.据我所知,我正在做什么(见下面的代码).我没有使用单例模式或静态或任何东西所以我不确定为什么会发生这种情况或如何避免它.我在下面发布了我的代码的相关部分供您查看.
基础存储库:
public class BaseRepository
{
/// <summary>
/// Initializes a repository and registers with a <see cref="IUnitOfWork"/>
/// </summary>
/// <param name="unitOfWork"></param>
public BaseRepository(IUnitOfWork unitOfWork)
{
if (unitOfWork == null) throw new ArgumentException("unitofWork");
UnitOfWork = unitOfWork;
}
/// <summary>
/// Returns a <see cref="DbSet"/> of entities.
/// </summary>
/// <typeparam name="TEntity">Entity type the dbset needs to return.</typeparam>
/// <returns></returns>
protected virtual DbSet<TEntity> GetDbSet<TEntity>() where TEntity : class
{
return Context.Set<TEntity>();
}
/// <summary> …Run Code Online (Sandbox Code Playgroud) 我有一个问题,当我尝试访问我的PartsDbContext中的字段时,我收到以下错误:
System.Data.SqlClient.SqlException:'无效的对象名'fieldName''
这似乎是因为我试图使我的PartsDbContext使用与我的ApplicationDbContext相同的数据库,该数据库与Identity一起使用.我需要知道如何设置第二个dbcontext以使用/使用/创建不同数据库的EF核心.
我已经尝试创建第二个连接字符串,但这会让我犯这个错误:
System.Data.SqlClient.SqlException:'无法打开登录请求的数据库"PartsDb".登录失败.用户'DESKTOP-4VPU567\higle'登录失败.'
这是我的代码:
appsettings.json
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-PrecisionCustomPC-b14db89e-86ad-4855-a17f-ac64a04339aa;Trusted_Connection=True;MultipleActiveResultSets=true",
"PartsConnection": "Server=(localdb)\\mssqllocaldb;Database=PartsDb"
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Warning"
}
}
Run Code Online (Sandbox Code Playgroud)
PartsDbContext.cs
public class PartsDbContext : DbContext
{
public DbSet<PartsViewModels.Tower> Towers { get; set; }
public DbSet<PartsViewModels.Motherboard> Motherboards { get; set; }
public PartsDbContext(DbContextOptions<PartsDbContext> options)
: base(options)
{
}
}
Run Code Online (Sandbox Code Playgroud)
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddEntityFramework()
.AddDbContext<PartsDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("PartsConnection")));
services.AddMvc();
services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdminRole", policy …Run Code Online (Sandbox Code Playgroud) 我开始在任何地方看到上下文.在ASP.NET MVC中,有ControllerContexts,RequestContexts,HttpContexts,FormContexts.在Entity Framework中,您有ObjectContexts和DbContexts.Ninject有Ninject.Activation.IContext.
什么是背景?
asp.net-mvc httpcontext controllercontext objectcontext dbcontext
在我的应用程序中,有时需要在一次操作中将10,000行或更多行保存到数据库中.我发现简单地迭代并一次添加一个项目可能需要花费半个多小时.
但是,如果我禁用AutoDetectChangesEnabled它需要约5秒(这正是我想要的)
我正在尝试向DbSet创建一个名为"AddRange"的扩展方法,该方法将禁用AutoDetectChangesEnabled,然后在完成时重新启用它.
public static void AddRange<TEntity>(this DbSet<TEntity> set, DbContext con, IEnumerable<TEntity> items) where TEntity : class
{
// Disable auto detect changes for speed
var detectChanges = con.Configuration.AutoDetectChangesEnabled;
try
{
con.Configuration.AutoDetectChangesEnabled = false;
foreach (var item in items)
{
set.Add(item);
}
}
finally
{
con.Configuration.AutoDetectChangesEnabled = detectChanges;
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:有没有办法从DbSet获取DbContext?我不喜欢把它作为参数 - 感觉它应该是不必要的.
我想刷新我的所有实体DbContext而不重新创建它,我尝试了以下内容,但没有一个是有意义的:
var context = ((IObjectContextAdapter)myDbContext).ObjectContext;
var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(
EntityState.Added
| EntityState.Deleted
| EntityState.Modified
| EntityState.Unchanged)
where entry.EntityKey != null
select entry.Entity);
context.Refresh(RefreshMode.StoreWins, refreshableObjects);
//.......................................................................
foreach (var entry in this.Orm.ChangeTracker.Entries())
{
entry.State = EntityState.Unchanged;
}
this.Orm.ChangeTracker.DetectChanges();
Run Code Online (Sandbox Code Playgroud)
唯一一个刷新我的DbContext:
foreach (var i in this.Orm.ChangeTracker.Entries())
i.Reload();
Run Code Online (Sandbox Code Playgroud)
但它太慢了.你能帮我选择正确的方法吗?
dbcontext ×10
c# ×7
asp.net-mvc ×2
.net ×1
asp.net ×1
dbset ×1
httpcontext ×1
linq ×1
logging ×1
refresh ×1
repository ×1