2016-11-14 11 views
0

私はC#で、次のコードを持っている:私は、Entity Frameworkのを使用していますEntity Frameworkのの異常な動作

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; 
    } 
} 

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、単語列を含むテーブルを持っています。どちらもデータベース内にユニークなキー制約があります。次のように私の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" })); 
} 

私はAddSynonymDA方法でthis.context.SaveChanges();を呼び出し、すでにテーブル内に存在する値を追加するときは常に、テーブル内のすべてが正常であるが存在しませんが、値を追加するとき最初の例外を引き起こした前の最初の例外に対する例外をスローし、データベースに存在しない場合でも何もデータベースに追加されません。何故ですか?

Javaが既に存在することを示す次のエラーが表示されます。問題は、Javaが最初の呼び出しであることです.2番目の呼び出しとして、私はDB Javaを渡しました。

{ "UNIQUE KEY制約の違反 'IX_Searched'。オブジェクトに重複するキーを挿入できません 'dbo.Searched'。重複したキー値がされた(Javaの、2)。\ r個の\のnこの文は終了しました。" }

+1

最初の挿入が失敗した後に新しい 'context'を作成しようとしましたか? – hofmeister

+1

@hofmeisterいいえ、私が 'Main'メソッドで言及したように、私はただ一つの文脈しか持たず、いつもそれを使用します。それは間違っていますか? – Media

+0

このメソッドは 'AddNewWordToSearchedBL'ですか? –

答えて

1

私はあなたが列を自動的にインクリメントする必要があるエンティティを挿入しているときに、データベースつまり

でID列であることを列を設定していないと思われます。 私はこれを行う方法は、SQLサーバーを使用して、たとえば次のとおりです。

ALTER TABLE [User] DROP COLUMN [ID]; 

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

すでにID列を持っていないあなたが最初の行を必要としない場合。 これで、プロジェクト内のEFモデルを更新し、Userテーブルを削除し、データベースからモデルを右クリックして更新し、テーブルを選択します。

これで、EFモデルに新しいエントリを挿入すると、ID列が自動的に増分され、エラーは発生しません。

+0

私はそれをやった – Media

1

あなたはユニークな制約があるように見えるので、アイテムが存在するかどうか最初にチェックする必要があります。次に、コード内の参照の属性を利用する必要があります。

+1

はい、それは私が意味するものです。 –

関連する問題