实体框架的不寻常行为

时间:2016-11-14 07:44:40

标签: 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.Trim().ToLowerInvariant(), user);
        if (res == BusinessLayerStatus.StatusBL.SynonymNotAdded)
            ++dismissedCounter;
    }
    int numberOfFailures = dismissedCounter;
    return numberOfFailures;
}

以下代码适用于AddSynonymDA方法:

internal BusinessLayerStatus.StatusBL AddSynonymDA(string synonym, string word, User user)
{
    try
    {
        Synonym newSyn = new Synonym()
        {
            Meaning = synonym
        };
        //The following if means that the searched word does not exist int the Searched table
        if (this.context.Users.Where(a => a.Mail.Equals(user.Mail)).FirstOrDefault().Searcheds.Where(b => b.RealWord.Equals(word)).Count() == validNumberForKeyValues)
        {
            this.context.Users.Where(a => a.Mail.Equals(user.Mail)).FirstOrDefault().Searcheds.Where(b => b.RealWord.Equals(word)).FirstOrDefault().Synonyms.Add(newSyn);
            this.context.SaveChanges();
            return BusinessLayerStatus.StatusBL.SynonymAdded;
        }
        else
            return BusinessLayerStatus.StatusBL.SynonymNotAdded;
    }
    catch (Exception ex)
    {
        ExceptionAction(ex);
        return BusinessLayerStatus.StatusBL.SynonymNotAdded;
    }
}

我正在使用Entity Framework。我有一个表,其中包含一个Id,一个单词列。它们两者在数据库中具有唯一的键约束。我的main代码如下:

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。

  

{"违反UNIQUE KEY约束' IX_Searched'。无法在对象' dbo.Searched'中插入重复的密钥。重复键值为(java,2)。\ r \ n语句已终止。"}

2 个答案:

答案 0 :(得分:1)

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

换句话说,当您插入实体时,您需要一个列自动递增。 我这样做的方式是使用SQL server:

ALTER TABLE [User] DROP COLUMN [ID];

ALTER TABLE [User] 
    ADD [ID] integer identity not null;

如果您还没有ID列,则不需要第一行。 在此之后,通过删除User表并右键单击并从Database中更新模型并选择表来更新项目中的EF模型。

现在,当您在EF模型中插入新条目时,ID列将自动递增,您不会收到错误。

答案 1 :(得分:1)

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