【问题标题】:UpdateException: Operation is not valid due to the current state of the object when using Entity Framework and OracleUpdateException: 使用实体框架和 Oracle 时,由于对象的当前状态,操作无效
【发布时间】:2012-02-02 11:55:31
【问题描述】:

我正在尝试为持久性添加一个新的实体对象,但是我得到了一个 UpdateException,其内部异常是 InvalidOperationException 并带有以下消息:

由于对象的当前状态,操作无效。

正在创建的对象:

var something = new SITE
{
    EntityKey = new EntityKey("DataModelContainer.SITE", "SITE_ID", "ID"),
                    SITE_COMMON_REFERENCE = "hello",
                    SITE_ID = "hello"     
};

然后传递给:

public void ExportSiteData (SITE exportSiteData)
{
    _context.SITE.AddObject(exportSiteData);
    _context.SaveChanges(); //<-- Exception here
}

数据库是Oracle 11g,我可以通过Entity Framework成功提取数据。

我猜这个问题更多是在数据库方面,但是我可以成功地用两个“hello”值填充它,而没有键/引用完整性问题。

我非常感谢您指出正确的方向。谢谢

更多代码:

ExportSiteData 在实现IDisposable 的BillRepository 内:

class BillRepository : IDisposable
{
    private readonly DataModelContainer _context;        

    public BillRepository()
    {
        _context = new DataModelContainer();
    }

    public void ExportSiteData (SITE exportSiteData)
    {
        _context.SITE.AddObject(exportSiteData);
        _context.SaveChanges(); //<-- Exception here
    }

    public void Dispose()
    {
        if (_context != null) 
        { 
            _context.Dispose(); 
        } 
    }
}

并且这样调用:

using (var repo = new BillRepository())
{
    repo.ExportSiteData(something);
}

【问题讨论】:

  • 您是否查看了您发布的链接上的异常,就可能导致问题的原因而言。您是否正在关闭您正在调用的方法中您可能不知道的任何地方的连接的..?
  • @DJKRAZE - 是的,我都阅读了它们,但似乎没有任何帮助我的东西,我不相信我正在关闭连接,因为我在之前刚刚创建了 _context来电:_context = new DataModelContainer();
  • 你能粘贴那个代码吗..也许在新的之前或之后有一些事情正在做..我还注意到 ID 字段是如何在你的数据库中设置的是自动生成字段..?
  • @DJKRAZE - 我添加了似乎与我的问题相关的额外代码
  • 所以在这一行之后 repo.ExportSiteData(something);任何东西都不需要回购..?如果是这样..它正在被处理..只是试图遵循你的逻辑..

标签: c# oracle entity-framework exception oracle11g


【解决方案1】:

我在尝试升级旧项目时遇到此错误。

确保您的项目与您的包文件中列出的 .net 框架版本相匹配。例如。如果您列出了 net452,请确保您的项目设置为使用 net 4.5.2。如果您的解决方案中有多个项目,请确保它们都设置为正确的 .net 框架版本。

另外,我注意到在向项目添加新数据模型时,会混淆要添加哪个模型文件。我相信这是由于我的开发盒上安装了 TFS(我有快递,然后安装最新的)。为了解决这个问题,我暂时断开了项目与 TFS 的连接)。

【讨论】:

    【解决方案2】:

    这几天我也遇到了同样的问题,而且也和主键有关。

    就我而言,模型的源数据库没有设置主键(无论出于何种原因)。

    从这些表生成模型时,.ssdl 看起来像这样:

    <EntitySet Name="..." EntityType="Model.Store...." store:Type="Tables"     store:Schema="..." store:Name="...">
     <DefiningQuery>
     SELECT
     "..."."..." AS "...",
     ...
     </DefiningQuery>
    </EntitySet>
    

    "store:Name" 和 "DefiningQuery" 在表已有主键时不会生成。

    删除这两个部分后,我之前生成的 .ssdl 文件可以正常工作,即使对于仍然没有主键的表也是如此。

    【讨论】:

      【解决方案3】:

      验证相关表的主键(在 xml 中提取 .edmx 文件)在两个部分中都具有 StoreGeneratedPattern="Identity"。存在一个已知错误,即 EF 通过设计器修改一个部分,但不修改另一部分。在这两个部分中查找:

      <EntityType Name="TIMELINE">
                <Key>
                  <PropertyRef Name="ID"/>
                </Key>
      
        <Property Name="ID" Type="decimal" Nullable="false" Precision="19" StoreGeneratedPattern="Identity" />
      

      见

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-18
        • 1970-01-01
        • 2020-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多