2016-09-25 8 views
3

私の主キーの新しいGUID IDを生成できません。私は別のユーザーを作成しようとするたびに同じエラーを取得すると、新しいGUID IDを生成しません。Entity Frameworkデータベース - first + uniqueidentity結果新しいGUID IDなし

PRIMARY KEY制約 'PK_User'に違反しています。オブジェクト 'dbo.User'に重複する キーを挿入できません。重複するキー値は (00000000-0000-0000-0000-000000000000)です。ステートメントは 終了しました。

コード:

public partial class User 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public System.Guid Id { get; set; } 
    public string UserName { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
} 

マイUserControllerでコード

[HttpGet] 
public ActionResult Create() { 
    return View(); 
} 

[HttpPost] 
public ActionResult Create(User user) { 
     if (ModelState.IsValid) { 
      db.Users.Add(user); 
      db.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 

     return View(user); 
} 

どのように私は、自動的に新しいGUIDを生成していますか?

+0

ビュー(フォーム)コードはどのように見えますか? – Shyju

答えて

1

C#コードでは、指示するためGUIDが生成されません。あなたのモデルはIdの値がデータベース(DatabaseGenerated(DatabaseGeneratedOption.Identity)) によって生成されたことを示しています。問題はデータベースのテーブル定義にあります。あなたはSQLサーバー管理スタジオを使用して、SQLサーバーを使用している場合は、あなたのテーブルの定義を確認し、IDが実際に定義されていることを確認してください「アイデンティティ」

1

あなたが定義するこの

public User() 
{ 
    this.Id= Guid.NewGuid(); 
} 
+0

与えられたguiが既にテーブルの上にある場合はどうなりますか? – 0014

1

のように、クラスのコンストラクタで行うことができます戻り値の型を持つ主キーIdは文字列です:あなたのPKはGUIDである

public partial class User 
{ 

    [Key] 
    public string Id { get; set; } 
    ... 
} 

[HttpPost] 
public ActionResult Create(User user) 
{ 
    if (ModelState.IsValid) 
    { 
     user.Id = Guid.NewGuid().ToString(); // handling new id 

     // if you want to check duplicate: 
     bool exist = db.Users.SingleOrDefault(x => x.Id == user.Id) != null; 

     if (exist) 
     { 
      // code for duplicate key... 
     } 

     db.Users.Add(user); 
     db.SaveChanges(); 

     return RedirectToAction("Index"); 

    } 
    return View(user); 
} 
1

それはあまりをしないであろうから、私は、実際にGUID列の自動インクリメントのいくつかの並べ替えを実装する任意のDBMSを知りませんセンス。

そのため、必要に応じて別の列タイプに切り替えるか、またはautoincrement(DatabaseGeneratedOption.None)を削除して新しいGUIDを作成する必要があります。

EFはデータベースにID値を渡すことはないので(データベースが生成されるため)、データベースは新しいキー値を作成する方法を知らないため、このフォームのコードは機能しません。 Guid。

1

DatabaseGeneratedは、データベースによって生成されることを意味します。テーブルの列にデフォルトをNEWID()と指定しない限り、新しい値は決して得られません。常にGuid.Emptyの値になります。アプリケーションを動作させるには、2つのうちの1つを実行できます。最初にGuid.NewGuid()をコードから直接呼び出し、その値をEntity Frameworkに渡すことができます。このケースでは、は、Id C#プロパティの一部として[DatabaseGenerated(DatabaseGeneratedOption.Identity)]を保持する必要はありません。もう1つの解決策は、テーブルの列を変更し、デフォルト値をNEWID()に追加することです。その場合、この値を自分で生成する心配はなく、DatabaseGenerated属性が意味をなさないはずです。

関連する問題