我正在尝试使用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.
。 (我确信我没有改变任何事情)。
为什么框架认为我正在更新?我错了什么?
答案 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();