Tag: entity framework 6

entity framework“实体对象不能被IEntityChangeTracker的多个实例引用”

我收到了错误 IEntityChangeTracker的多个实例不能引用实体对象 尝试创建新实体并将其保存到数据库时。 我理解错误以及它是如何正常发生的,但在这种情况下,我所做的只是创建一个新实体并在保存之前向其添加一些int ,而不是从其他上下文添加任何其他实体。 我已经包含了导致错误的函数。 正如您所看到的那样,它正在传递一个EndProduct ,它是一个被_billableRepository中的一个不同上下文跟踪的实体,但是由于我不想尝试将该实体分配给新创建的可计费用,所以我不会看看它是如何成为一个问题。 我能看到错误发生的唯一方法是因为分配给新Billable一些int值是从正由不同上下文跟踪的现有EndProduct中获取的,但IEntityChangeTracker肯定不会跟踪个别实体的原语? public void AddBillable(EndProduct endProduct, int? purchaseId, string centreCode, int userId) { if (endProduct.Product != null) { var existingBillableForUserForProductId = _billableRepository.GetQuery(b => b.UserId == userId && b.ProductId == endProduct.ProductId); if (endProduct.BillablePartId != null && !existingBillableForUserForProductId.Any()) { var billable = new Billable { ProductId = endProduct.ProductId.Value, //int UserId […]

entity framework通过将当前值增加一而不选择来更新一列

我想要实现的是简单的SQL查询: UPDATE TABLE SET COLUMN = COLUMN + 1 有没有办法在没有首先将所有记录(数千)加载到内存并循环遍历每个记录以增加列然后将其保存回来的情况下实现它? 编辑 我尝试了原始的SQL,它工作。 我必须从连接字符串和连接上下文中的数据库模式名称决定sql提供程序。 之后,我将使用相应的sql查询来更新表。 对于SQL,它看起来像UPDATE schemaname.TABLE SET COLUMN = COLUMN + 1 。 对于POSTGRESQL,我必须双重引用模式名称,表名和列名: UPDATE“schemaname”。“TABLE”SET“COLUMN”=“COLUMN”+ 1 。

导航属性无法加载属性

我的上下文如下: public class ApplicationDbContext: IdentityDbContext { public ApplicationDbContext() : base(“DefaultConnection”) { this.Configuration.LazyLoadingEnabled = true; } //DbSet properties } 所以,启用了延迟加载。 我有以下课程: public class Home { private ICollection _slides; [Key] [Required] public string Name { get; set; } [ForeignKey(“Header”)] public int? HeaderID { get; set; } //Navigation properties public ICollection Slides { get { return _slides ?? […]

活动Azure Sql连接超出了连接池限制

我们的Azure SQL数据库性能会在很长一段时间内显着降低,我们会在生产中解决问题。 我们知道我们在其中一个表上有锁,但是这些锁不是死锁,它们是长锁,并且在一个小时左右的时间内性能恢复正常。 我们正试图找到关于如何获得这些长锁的所有可能场景(每个查询都超快,所有性能分析器都可以向我们展示导致长锁的原因)。 这个问题的原因如下图所示: Out连接池设置仅允许汇集200个连接。 大多数时候,我们与数据库有大约10-20个开放/池化连接。 然后突然有许多活动连接开始增长,并且池完全被占用。 虽然许多池化连接保持在200以下,但我们看到使用sp_who2的多个活动连接达到1.5k-2k连接(有时为4k-5k)。 我使用Azure门户监控工具构建了相同的图表。 它有不同的聚合期,但显示相同的问题: 我们使用的连接字符串: Data Source = [server] .database.windows.net; initial catalog = [database]; persist security info = True; user id = [user]; password = [password]; MultipleActiveResultSets = True; Connection Timeout = 30; Max Pool大小= 200;池=真;应用= [AppName的] 考虑到200个连接的连接池限制,这怎么可能? ps:没有周期性任务,长时间运行的查询或其他任何工具,我们检查sp_who2与sp_who2所有活动连接。

在Entity Framework支持的Web API 2 POST调用中返回一个对象以及409 Conflict错误?

我有一个C#Entity Framework Web API 2控制器 。 目前,当通过POST方法尝试创建具有相同文本的主文本字段的对象时,我返回409 Conflict错误作为StatusCode结果,以指示添加被视为重复。 我想做的是返回触发重复错误的服务器端对象。 所以我需要一些类似于Ok()方法的东西,但是一个变量返回409 Conflict错误作为HTTP状态代码而不是HTTP OK状态代码 。 有这样的事吗? 我怎样才能做到这一点? 如果我可以完成这项工作,客户端在收到409 Conflict错误后不必对服务器进行后续的Get调用以获取现有对象。 这是当前的POST方法: public IHttpActionResult PostCanonical(Canonical canonical) { if (!ModelState.IsValid) { return BadRequest(ModelState); } // Check for duplicate Canonical text for the same app name. if (db.IsDuplicateCanonical(canonical.AppName, canonical.Text)) { // It’s a duplicate. Return an HTTP 409 Conflict error to […]

EF 6.0中缺少DbSet .Load()函数

我试图访问DbSet.Load()函数来加载实体。 EF 6.0中不再存在此function; 经过一定的调查,我发现它是EF扩展库中定义的扩展方法的一部分。 我获得了EF 6.0扩展库的参考NuGet包,但似乎不再支持它。 我尝试通过调用.ToList()来替代该函数,但是这个方法在处理时返回一个内部exception: ({“The column name is not valid. [ Node name (if any) = Extent1,Column name = HasErrors ]”} ) 我仔细检查了数据库表的映射类,但它看起来很好。 不知道我错过了什么。 下面是我的映射类的代码: internal class CustomerMapping : EntityTypeConfiguration { public CustomerMapping() { this.HasKey(t => t.Id); this.Property(t => t.Id).HasColumnName(“CUSTOMER_ID”); this.Property(t => t.Name).HasMaxLength(30).HasColumnName(“NAME”); this.Property(t => t.Email).HasMaxLength(30).HasColumnName(“EMAIL”); this.Property(t => t.PhoneNo).HasMaxLength(100).HasColumnName(“PHONE_NO”); this.Property(t => t.MobileNo).HasMaxLength(100).HasColumnName(“MOBILE_NO”); […]

具有非主键值的FindAsync

public class Foo { public int Id { get; set; } public int UserId { get; set; } } 这似乎是异步执行此操作的方法: DatabaseContext db = new DatabaseContext(); Foo foo = await db.Foos.FindAsync(fooid); 如何根据UserId的值异步获取特定用户的所有Foos?

修改IQueryable.Include()的表达式树以向连接添加条件

基本上,我想实现一个存储库,即使通过导航属性也可以过滤所有软删除的记录。 所以我有一个基本实体,类似的东西: public abstract class Entity { public int Id { get; set; } public bool IsDeleted { get; set; } … } 还有一个存储库: public class BaseStore : IStore where TEntity : Entity { protected readonly ApplicationDbContext db; public IQueryable GetAll() { return db.Set().Where(e => !e.IsDeleted) .InterceptWith(new InjectConditionVisitor(entity => !entity.IsDeleted)); } public IQueryable GetAll(Expression<Func> predicate) […]

用于创建具有内部Collection的谓词的动态查询

我正在为我的MVC EF应用程序创建搜索function。 我正在使用动态查询创建它。 并遵循此方法https://www.codeproject.com/Articles/493917/Dynamic-Querying-with-LINQ-to-Entities-and-Express 它用于为实体的bool和string字段创建谓词。 我的应用程序中的主要实体是Applicant EDMX Applicant正在关注 public partial class Applicant { public Applicant() { this.ApplicantEducations = new HashSet(); this.ApplicantSkills = new HashSet(); this.Applications = new HashSet(); this.Experiences = new HashSet(); } public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } public […]

如何使用Entity Framework和Moq进行unit testing?

我是Moq的新手,想要像数据的后备存储一样使用它 – 但是没有触及实时数据库。 我的设置如下: UnitOfWork包含所有存储库,用于整个应用程序的数据访问。 Repository表示由DbContext提供的直接挂钩到DbSet。 DbContext包含所有DbSet。 这是我到目前为止的测试: // ARRANGE var user = new User() { FirstName = “Some”, LastName = “Guy”, EmailAddress = “some.guy@mockymoqmoq.com”, }; var mockSet = new MockDbSet(); var mockContext = new Mock(); mockContext.Setup(c => c.Set()).Returns(mockSet.Object); // ACT using (var uow = UnitOfWork.Create(mockContext.Object)) { uow.UserRepository.Add(user); uow.SaveChanges(); } // ASSERT mockSet.Verify(u => u.Add(It.IsAny()), […]