C# 实体框架的异常行为

C# 实体框架的异常行为,c#,entity-framework,C#,Entity Framework,我有以下C代码: public int AddSynonymBL(String[] syns, String word, User user) { int dismissedCounter = 0; foreach (var item in syns) { BusinessLayerStatus.StatusBL res = this.dataAccess.AddSynonymDA(item.Trim().ToLowerInvariant(), word.

我有以下C代码:

public int AddSynonymBL(String[] syns, String word, User user)
{
    int dismissedCounter = 0;
    foreach (var item in syns)
    {
        BusinessLayerStatus.StatusBL res = this.dataAccess.AddSynonymDA(item.Trim().ToLowerInvariant(), word.Trim().ToLowerInvariant(), user);
        if (res == BusinessLayerStatus.StatusBL.SynonymNotAdded)
            ++dismissedCounter;
    }
    int numberOfFailures = dismissedCounter;
    return numberOfFailures;
}
下面的代码用于AddSynonymDA方法:

我使用的是实体框架。我有一个包含Id和word列的表。它们在数据库中都有唯一的键约束。我的主要代码如下:

public static void Main()
{
    EngineEntities context = new EngineEntities();
    BusinessLogic bl = new BusinessLogic();
    String[] s = new String[] { "java", "DB" };
    Console.WriteLine(bl.AddSynonymBL(s, "Java", new User() { Mail = "media" }));
}
当我添加一个表中不存在的值时,一切正常,但当我添加一个表中已经存在的值时,调用this.context.SaveChanges;在AddSynonymDA方法中,始终引发一个异常,该异常是针对导致第一个异常的前一个第一个异常,并且不会向数据库中添加任何内容,即使数据库中不存在这些内容。为什么呢

我得到以下错误,表明Java已经存在。问题是Java用于第一个调用,作为第二个调用,我传递的是DB而不是Java

{违反了唯一键约束“IX_Searched”。无法在对象“dbo.Searched”中插入重复键。重复键值为java,2。\r\n语句已终止。}


我怀疑您没有将列设置为数据库中的标识列

换句话说,当插入实体时,需要一列自动递增。 例如,我使用SQL server执行此操作:

ALTER TABLE [User] DROP COLUMN [ID];

ALTER TABLE [User] 
    ADD [ID] integer identity not null;
如果您还没有ID列,则不需要第一行。 在此之后,通过删除用户表,右键单击并从数据库更新模型,然后选择表,更新项目中的EF模型


因此,现在当您在EF模型中插入新条目时,ID列将自动递增,并且不会出现错误。

我怀疑您没有将列设置为数据库中的标识列

换句话说,当插入实体时,需要一列自动递增。 例如,我使用SQL server执行此操作:

ALTER TABLE [User] DROP COLUMN [ID];

ALTER TABLE [User] 
    ADD [ID] integer identity not null;
如果您还没有ID列,则不需要第一行。 在此之后,通过删除用户表,右键单击并从数据库更新模型,然后选择表,更新项目中的EF模型


因此,现在当您在EF模型中插入新条目时,ID列将自动递增,并且不会出现错误。

您必须首先检查该项是否存在,因为您似乎有一个唯一的约束,然后您应该在代码中使用引用属性。

您必须首先检查该项是否存在,因为您似乎有一个唯一的约束,然后您应该在代码中使用引用属性。

您是否尝试在第一次插入失败后创建新的上下文?@hofmeister no,正如我在Main方法中提到的,我只有一个上下文,我总是使用它。错了吗?这个方法是什么?AddNewWordToSearchedBL?@media我不确定。可能上下文保持错误状态。尝试创建一个新的?我总是在ef的上下文中使用。@hofmeister你确定吗?因为据我所知,EF的一个实例应该总是被使用。在第一次插入失败后,你是否尝试创建一个新的上下文?@hofmeister否,正如我在Main方法中提到的,我只有一个上下文,我总是使用它。错了吗?这个方法是什么?AddNewWordToSearchedBL?@media我不确定。可能上下文保持错误状态。尝试创建一个新的?我总是在ef的上下文中使用。@hofmeister你确定吗?因为正如我所了解的,应该始终使用一个EF实例