我在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语句已终止。"}
答案 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)
您必须首先检查项目是否存在,因为您似乎有一个唯一约束,那么您应该在代码中使用引用属性。