什么时候应该DbContext.dispose()用实体框架调用?
这种想象的方法难道不好吗?
public static string GetName(string userId)
{
var context = new DomainDbContext();
var userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
context.Dispose();
return userName;
}
Run Code Online (Sandbox Code Playgroud)这是否更好?
public static string GetName(string userId)
{
string userName;
using(var context = new DomainDbContext()) {
userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
context.Dispose();
}
return userName;
}
Run Code Online (Sandbox Code Playgroud)这是否更好,也就是说,当使用using()时,是否应该调用context.Dispose()?
public static string GetName(string userId)
{
string userName;
using(var context = new DomainDbContext()) {
userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
}
return userName;
}
Run Code Online (Sandbox Code Playgroud)我正在尝试使用模拟的DbContext为我的服务创建单元测试.我创建了一个IDbContext具有以下功能的界面:
public interface IDbContext : IDisposable
{
IDbSet<T> Set<T>() where T : class;
DbEntityEntry<T> Entry<T>(T entity) where T : class;
int SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我真正的上下文实现了这个接口IDbContext和DbContext.
现在我正在尝试IDbSet<T>在上下文中模拟它,所以它返回一个List<User>代替.
[TestMethod]
public void TestGetAllUsers()
{
// Arrange
var mock = new Mock<IDbContext>();
mock.Setup(x => x.Set<User>())
.Returns(new List<User>
{
new User { ID = 1 }
});
UserService userService = new UserService(mock.Object);
// Act
var allUsers = userService.GetAllUsers();
// Assert
Assert.AreEqual(1, allUsers.Count());
}
Run Code Online (Sandbox Code Playgroud)
我总是得到这个错误.Returns: …
我正在寻找为DbContext设置CommandTimeout的方法.搜索之后,我通过将DbContext转换为ObjectContext并为objectContext的CommandTimeout属性设置值来找到方法.
var objectContext = (this.DbContext as IObjectContextAdapter).ObjectContext;
Run Code Online (Sandbox Code Playgroud)
但我必须使用DbContext.
我有一个桌面客户端应用程序,它使用模态窗口来设置分层对象的属性.由于这是一个客户端应用程序,并且没有线程化对DbContext的访问,我在主Form上使用长时间运行的上下文传递给模态子项.
这些模态窗口使用PropertyGrid显示实体属性,还具有取消按钮.如果修改了任何数据并按下了取消按钮,则更改将反映在父表单中(我无法处理DbContext object).
如果DbContext.SaveChanges()没有调用该方法,有没有办法丢弃所做的任何更改?
更新:实体框架版本4.4.
我想知道实现事务的最佳方式是什么DBContext.特别是,
DbContext.SaveChanges如果我更改多个实体,是否实现事务内部?DbContext.SaveChanges多次呼叫(相同的contxet /不同的contxets),如何实现交易?entity-framework transactions entity-framework-4.1 dbcontext
在通过Entity Framework 4.1添加记录时,是否有直接的方法来检索数据库自动生成的主键?
例如:
dbcontext.Entity_Tables.Add(new Entity_Table { item1 = val1, item2 = val2 });
dbcontext.SaveChanges();
newPK = ???;
Run Code Online (Sandbox Code Playgroud)
SQL等价物将是:
newPK = executeOnDB("INSERT INTO Entity_Table (item1, item2) VALUES (val1, val2);SELECT @@Indentity";);
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我使用的是MySQL,但SQL与MSSQL上的相同
在数据库优先的场景中使用DbContext时,我发现与ObjectContext相比,添加和删除实体的速度非常慢.如果添加2000个实体并在最后保存更改,DbContext比ObjectContext慢3到5倍(顺便说一句:我知道使用SqlBulkCopy添加大量实体会更好,但这不是重点).如果在每次添加后保存更改,DbContext仍然慢近两倍.当涉及删除时,它甚至变得更糟:当在所有实体删除结束时保存时,DbContext比ObjectContext慢大约18倍.
我使用了我用来比较数据库访问技术和小型控制台应用程序的高度开发的测试应用程序来进行双重检查.两者都显示使用DbContext添加和删除实体的结果不佳.以下是控制台应用程序的结果:
Inserting 2000 entities via DbContext saving changes at the end: 2164ms
Inserting 2000 entities via ObjectContext saving changes at the end: 457ms
Inserting 2000 entities via DbContext saving changes after each object addition: 8420ms
Inserting 2000 entities via ObjectContext saving changes after each object adding: 4857ms
Inserting 2000 entities via DbContext using a new DbContext for each object addition: 4018ms
Deleting 2000 entities via DbContext saving changes at the end: 4794ms
Deleting 2000 entities via ObjectContext saving changes …Run Code Online (Sandbox Code Playgroud) 我有点难过.根据我的阅读设置DbContext.AutoDetectChangesEnabled,false应该禁用需要调用的更改跟踪DbContext.DetectChanges,以便识别要发送到数据库的更改.
但是,从我的下面的日志中可以清楚地看到,dbContexts更改跟踪器正在注册更改,即使设置为false也是如此.
我错过了什么吗?
实体框架版本:5.0.0.0
DbContext类
public class ProjectContext : DbContext {
public DbSet<Project> Projects {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
控制器类
private ProjectContext db = new ProjectContext();
public method(){
Project p = new Project("uniqueName");
db.Configuration.AutoDetectChangesEnabled = false;
db.Projects.Add(p);
DebugChangeTracker();
db.SaveChanges();
db.Projects.First().ProjectName = "a differentName!";
DebugChangeTracker();
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
记录方法
private void DebugChangeTracker()
{
var path = "C:\\mypath\\";
path = path + Util.GetMsSinceEpoch().ToString() + "changeTracker.log";
using (StreamWriter sw = new StreamWriter(path))
{
var changeTracker = db.ChangeTracker;
var entries = changeTracker.Entries(); …Run Code Online (Sandbox Code Playgroud) 鉴于以下代码,EF/DbContext如何了解对客户对象所做的更改:
class Program
{
static void Main()
{
using(var shopContext = new ShopContext())
{
var customer = shopContext.Customers.Find(7);
customer.City = "Marion";
customer.State = "Indiana";
shopContext.SaveChanges();
}
}
}
public class ShopContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
}
public class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string City { get; set; }
public string State { …Run Code Online (Sandbox Code Playgroud) 我不知道是否有更好的方法来使用它,DbContext因为在使用WCF时不建议将其设置为静态.所以我们每次想要访问数据库时都会创建它.
了解使用实体框架的所有优点,有些变得无用,因为我们DbContext每次都在重新创建; 因为要考虑创建大实体模型的过程,所以可能会导致更多开销.
你有什么意见?
dbcontext ×10
c# ×5
.net ×2
idisposable ×1
moq ×1
transactions ×1
undo ×1
unit-testing ×1
wcf ×1