- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
(EF4.1 - 4.0 框架)
网络上的大多数代码示例都规定了 Entity Framework 的最佳实践;他们说将您对 DBContext 的使用包装在一个 using block 中,以确保无状态操作。即便如此,我还是收到了似乎是共享缓存错误。
错误
An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.
环顾四周,当有人在许多调用中共享 DBContext 的全局实例时,就会出现这种情况的示例。
然而,我在第二次调用位于静态数据访问层服务类中的以下函数时收到此消息。
public static void UpdateRollout(Rollout rollout)
{
using (ITAMEFContext db = new ITAMEFContext(ConnectionStrings.XYZConnectionString))
{
db.Configuration.ProxyCreationEnabled = false;
db.Configuration.LazyLoadingEnabled = false;
FixUp(rollout);
db.Rollouts.Attach(rollout);
db.Entry(rollout).State = System.Data.EntityState.Modified;
db.SaveChanges();
//db.Entry(rollout).State = System.Data.EntityState.Detached;
}
}
private static void FixUp(Rollout rollout)
{
// ensure manual fixup of foreign keys
if (rollout.RolloutState != null)
rollout.FK_RolloutState_ID = rollout.RolloutState.ID;
if (rollout.Lead != null)
rollout.RolloutLead_FK_User_ID = rollout.Lead.ID;
}
EFContext 是通过引用 edmx 模型的 EF 4.x DBContext Fluent Generator 生成的。
看起来像这样。
public partial class ITAMEFContext : DbContext
{
static ITAMEFContext()
{
Database.SetInitializer<ITAMEFContext>(null);
}
public ITAMEFContext() : base("name=ITAMEFContext")
{
this.Configuration.LazyLoadingEnabled = false;
}
public ITAMEFContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
}
public ITAMEFContext(string nameOrConnectionString, DbCompiledModel model) : base(nameOrConnectionString, model)
{
}
public ITAMEFContext(DbConnection existingConnection, bool contextOwnsConnection) : base(existingConnection, contextOwnsConnection)
{
}
public ITAMEFContext(DbConnection existingConnection, DbCompiledModel model, bool contextOwnsConnection) : base(existingConnection, model, contextOwnsConnection)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
modelBuilder.Configurations.Add(new Asset_Mapping());
modelBuilder.Configurations.Add(new AssetAllocation_Mapping());
modelBuilder.Configurations.Add(new AssetAssignee_Mapping());
modelBuilder.Configurations.Add(new AssetAssigneeType_Mapping());
modelBuilder.Configurations.Add(new AssetDeAllocation_Mapping());
modelBuilder.Configurations.Add(new AssetState_Mapping());
modelBuilder.Configurations.Add(new AssetType_Mapping());
modelBuilder.Configurations.Add(new Department_Mapping());
modelBuilder.Configurations.Add(new Location_Mapping());
modelBuilder.Configurations.Add(new ManagementGroup_Mapping());
modelBuilder.Configurations.Add(new Role_Mapping());
modelBuilder.Configurations.Add(new Rollout_Mapping());
modelBuilder.Configurations.Add(new RolloutState_Mapping());
modelBuilder.Configurations.Add(new ServiceArea_Mapping());
modelBuilder.Configurations.Add(new Software_Mapping());
modelBuilder.Configurations.Add(new SoftwareType_Mapping());
modelBuilder.Configurations.Add(new SubTeam_Mapping());
modelBuilder.Configurations.Add(new sys_UserLock_Mapping());
modelBuilder.Configurations.Add(new Team_Mapping());
modelBuilder.Configurations.Add(new User_Mapping());
modelBuilder.Configurations.Add(new WorkingMethod_Mapping());
}
public DbSet<Asset> Assets { get; set; }
public DbSet<AssetAllocation> AssetAllocations { get; set; }
public DbSet<AssetAssignee> AssetAssignees { get; set; }
public DbSet<AssetAssigneeType> AssetAssigneeTypes { get; set; }
public DbSet<AssetDeAllocation> AssetDeAllocations { get; set; }
public DbSet<AssetState> AssetStates { get; set; }
public DbSet<AssetType> AssetTypes { get; set; }
public DbSet<Location> Locations { get; set; }
public DbSet<Department> Departments { get; set; }
public DbSet<ManagementGroup> ManagementGroup { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<ServiceArea> ServiceAreas { get; set; }
public DbSet<SubTeam> SubTeams { get; set; }
public DbSet<Team> Teams { get; set; }
public DbSet<User> User { get; set; }
public DbSet<WorkingMethod> WorkingMethods { get; set; }
public DbSet<Rollout> Rollouts { get; set; }
public DbSet<RolloutState> RolloutStates { get; set; }
public DbSet<Software> Softwares { get; set; }
public DbSet<SoftwareType> SoftwareTypes { get; set; }
public DbSet<sys_UserLock> sys_UserLock { get; set; }
}
我希望能够根据需要多次从我的 BL 层调用 UpdateRollout。UI 将需要保留作为先前获取的列表的一部分返回的 POCO Rollout 实体图。
Rollout 和所有其他实体都是纯 POCO,不需要上下文跟踪。
我读到,一旦 using block 处理了 ITAMEFContext,任何上下文缓存/跟踪都会被删除。然而,在同一应用程序域中,似乎有某种全局缓存在 DBContext 的任何实例之下?老实说,到目前为止,EF 似乎比对分层应用程序使用良好的旧存储过程更有效。
POCO。
public partial class Rollout
{
public Rollout()
{
this.AssetAssignees = new HashSet<AssetAssignee>();
}
public int ID { get; set; }
public string Name { get; set; }
public int RolloutLead_FK_User_ID { get; set; }
public string EmailContacts { get; set; }
public System.DateTime Schedule { get; set; }
public int FK_RolloutState_ID { get; set; }
public Nullable<int> NotificationDays { get; set; }
public string Notes { get; set; }
public virtual ICollection<AssetAssignee> AssetAssignees { get; set; }
public virtual User Lead { get; set; }
public virtual RolloutState RolloutState { get; set; }
}
编辑:
映射。
internal partial class Rollout_Mapping : EntityTypeConfiguration<Rollout>
{
public Rollout_Mapping()
{
this.HasKey(t => t.ID);
this.ToTable("Rollout");
this.Property(t => t.ID).HasColumnName("ID");
this.Property(t => t.Name).HasColumnName("Name").IsRequired().HasMaxLength(50);
this.Property(t => t.RolloutLead_FK_User_ID).HasColumnName("RolloutLead_FK_User_ID");
this.Property(t => t.EmailContacts).HasColumnName("EmailContacts").HasMaxLength(500);
this.Property(t => t.Schedule).HasColumnName("Schedule");
this.Property(t => t.FK_RolloutState_ID).HasColumnName("FK_RolloutState_ID");
this.Property(t => t.NotificationDays).HasColumnName("NotificationDays");
this.Property(t => t.Notes).HasColumnName("Notes");
this.HasRequired(t => t.Lead).WithMany(t => t.Rollouts).HasForeignKey(d => d.RolloutLead_FK_User_ID);
this.HasRequired(t => t.RolloutState).WithMany(t => t.Rollouts).HasForeignKey(d => d.FK_RolloutState_ID);
}
}
最佳答案
我遇到了一个非常相似的问题,和你一样,我认为是某种全局缓存导致了这个问题。
我的用例是这样的:
第一次测试一切正常,但在第二次测试中出现重复键错误。
这让我困惑了一段时间,直到我意识到我用来构建我的一些测试数据实体的工厂方法正在将它们创建为静态对象;第二次循环时,只要我将这些静态实体添加到上下文中,这些实体的完整对象图就会重新添加,所以当我稍后添加其他实体时,它们已经在那里了。
这是一个简化的例子......
循环 1:
循环 2:
解决方案: 我更改了我的工厂方法,这样我的所有实体都不是静态的。问题解决了。
关于c# - Entity Framework DBContext 全局缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16308124/
我有这些实体(这只是我为这篇文章创建的抽象): 语言 区 说明 这些是它们之间的引用: 区 * - 1 语言 说明 * - 1 语言 区 1 - 1 说明 如果我这样取: var myFetch =
经过大量谷歌搜索后,除了降级 hibernate 版本之外,我没有找到问题的答案。但我在 2003 年类似的帖子中遇到了这种情况。 问题是什么: //in the first session I d
我听说过 linq to entities 。 Entity Framework 是利用linq to entities吗? 最佳答案 LINQ to Entities 是 Entity Framew
我是 Entity Framework 和 ASP.Net MVC 的新手,主要从教程中学习,对任何一个都没有深入了解。 (我确实有 .Net 2.0、ADO.Net 和 WebForms 方面的经验
如果我编写 LINQ to Entities 查询,该查询是否会转换为提供程序理解的 native 查询(即 SqlClient)? 或者 它是否会转换为实体 SQL,然后 Entity Framew
这个问题已经有答案了: EF: Include with where clause [duplicate] (5 个回答) 已关闭 2 年前。 看来我无法从数据库中获取父级及其子级的子集。 例如...
我开始在一家新公司工作,我必须在一个旧项目上使用 C++ 工作。所以,我忘记了一些 C++ 本身的代码结构。在一个函数中,我在一个函数中有双冒号::,但我不知道如何理解它。 例如,我知道如果我有 EN
我写了一个方法来允许为 orderby 子句传递一个表达式,但我遇到了这个问题。 Unable to cast the type 'System.DateTime' to type 'System.I
简单的问题:LINQ to Entities 和 Entity Framework 有什么区别?到目前为止,我认为这两个名称是用来描述同一个查询的,但我开始觉得事实并非如此。 最佳答案 Entity
我想使用 Entity Framework 。但是,我还要求允许我的用户在我们的系统中定义自定义字段。我想仍然使用 Entity Framework ,而不是使用具有哈希表属性的分部类。 下面是我想到
我正在阅读这个 E.F. 团队博客的这个系列 http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-featu
我正在使用 EF6 开发插件应用程序,代码优先。 我有一个名为 User 的实体的主要上下文。 : public class MainDataContext : DbContext { pub
当我得到最后的 .edmx 时,我遇到了问题。 我收到一条消息说 错误 11007:未映射实体类型“pl_Micro”。 查看设计器 View ,我确实看到该表确实存在。 我怎样才能克服这个消息? 最
我已阅读与使用 Entity Framework 时在 Linq to Entities (.NET 3.5) 中实现等效的 LEFT OUTER JOIN 相关的所有帖子,但尚未找到解决以下问题的方
使用 WCF RIA 服务和 Entity Framework 4. 我有 3 个 DTO:学校、州、区。 州 DTO 有一个地区属性(property),其构成。学校 DTO 有一个国家属性(pro
我有一个 Employee 实体,它继承自一个继承自 Resource 实体(Employee -> Person -> Resource)的 Person 实体。是否可以通过编程方式获取 Emplo
我有一个使用 JPA 的 java 应用程序。 假设我有一个名为 Product 的实体与 name和 price属性(所有实体都有一个 id 属性)。 自然我可以得到一个List相当容易(来自查询或
我有一个 Entity Framework 类,其中有两个指向另一个对象的引用 public class Review { [Key] public int Id {get;s
我是 Symfony 2 的新手,我想知道一些事情: 假设我的项目中有 2 个 bundle 。我想在两个包中使用从我的数据库生成的实体。 我应该在哪里生成实体? (对我来说,最好的方法是在 bund
我想在具有方法和属性的部分类中扩展 EF 实体。我经常这样做。 但是现在我需要将来自该实体的数据与来自其他实体的数据结合起来。因此,我需要能够访问实体 objectcontext(如果附加)来进行这些
我是一名优秀的程序员,十分优秀!