我尝试添加实体时实体框架中的InnerException

时间:2013-01-05 00:10:41

标签: c# visual-studio-2010 entity-framework entity-relationship

我正在尝试使用Entity Framework将实体插入到我的数据库中。见下文:

private void InsertarIntoDataBase()
{

    Juego game = db.games.First(g => g.Id == anId);
    Day d = new Day {
                       DayNumber = this.Number,
                       Game = game // This is a relationship. One Day has one game 
                    };
    db.AddToDay(d);
    db.SaveChanges();
}

这始终是插入,而不是更新。我第一次运行我的应用程序,它可以工作,之后它停止工作,抛出此异常An error occurred while updating the entries. See the InnerException for details.。 (我确信我没有改变任何事情)。

为什么框架认为我正在更新?我错了什么?

4 个答案:

答案 0 :(得分:8)

如果您的更新命令失败,

SaveChanges将抛出System.Data.Entity.Infrastructure.DbUpdateException,它会包裹最终包裹System.Data.UpdateException的{​​{1}}。同样重要的是要注意内部 - 内部异常可以是System.Data.SqlClient.SqlException以外的其他异常,具体取决于您使用的实体框架提供程序。

如果您打开这些内容,可以查看原始SqlException对象,这些对象会为您提供有关更新问题的具体详细信息。

SqlError

您还可以通过捕获try { db.SaveChanges(); } catch (DbUpdateException ex) { UpdateException updateException = (UpdateException)ex.InnerException; SqlException sqlException = (SqlException)updateException.InnerException; foreach (SqlError error in sqlException.Errors) { // TODO: Do something with your errors } } 获得更多权力和控制权,这将显示在调用System.Data.Entity.Validation.DbEntityValidationException期间发生的任何验证错误。默认行为是验证保存时的更改。您也可以致电SaveChanges预先验证更改。

答案 1 :(得分:4)

这并不意味着您正在进行更新,这只意味着发生了SQL错误。您需要读取内部异常以找出实际错误。从它的外观来看,它可能是与主键或外键约束相关的东西,即。您正在添加一个项目,并且该主键已在表格中。但同样,实际错误会给你更多细节。

如果您在Visual Studio中运行,它应该自动中断异常,您可以展开内部异常属性。如果没有,您可以放置​​try / catch块并将其记录到文件或写入控制台。 Exception.ToString()也会显示所有内部异常,因为SQL错误往往会将真正的错误包含在几个不同的异常中。

private void InsertarIntoDataBase()
{
    try 
    {
        Juego game = db.games.First(g => g.Id == anId);
        Day d = new Day {
                           DayNumber = this.Number,
                           Game = game // This is a relationship. One Day has one game 
                        };
        db.AddToDay(d);
        db.SaveChanges();
    }
    catch (Exception e)
    {
        Console.WriteLine(e); // or log to file, etc.
        throw; // re-throw the exception if you want it to continue up the stack
    }
}

答案 2 :(得分:0)

根据Despertar的回答,我可以解决我的问题。 实体框架有一个名为StoreGeneratedPattern的选项。此选项指示需要设置主键ID时的行为。默认情况下,此选项为“无”,因此如果您想要自动增量,请将选项StoreGeneratedPattern设置为“标识”。 This是我读过的链接。

答案 3 :(得分:0)

是...始终确保如果我们的实体有guid,那么'StoreGeneratedPattern'必须设置值“Identity”。因为默认情况下,sqlserver不会为guid列添加值。

可以通过选择entity-right click-properties-select guid column-set storedGeneratedPattern to identity来从edmx设置。

或者通过从代码本身向列分配'Guid.newGuid()'值。 恩。 product.Id = Guid.newGuid();

相关问题