2017-07-04 18 views
0

外部キーが "BranchOffice_Id"のテーブルとBranchOfficeという名前のテーブルが、自動インクリメントのプライマリキー "Id"で作成されています。ユーザーテーブルにデータを追加する際にいくつかの問題があります。ここで私のコードは、C#でエンティティフレームワークを使用して書かれています。自動インクリメントされた外部キーを追加したいテーブルに新しい行を追加しました

currentUser = new User() 
{ 
    Username = username, 
    UserType = UserType.User, 
    Email = email, 
    Name = name, 
    BranchOffice = _taskService.GetBranchOfficeById(branchOffice) 
}; 
_db.Users.Add(currentUser); 
_db.SaveChanges(); 

_db.Users.Add(currentUser);までcurrentUser.BranchOfficeの値はBranchOfficeテーブルの番号#1に対応し、1です。しかし、問題は次のとおりです。_db.SaveChanges();で、その値は保存されず、代わりにインクリメントされた値(「5」から開始され、BranchOfficeテーブルでは4行しかありません)。最後に、BranchOfficeテーブルに新しい行を追加しました。ここで

は私のモデルです:

public class User : IPrincipal, IIdentity 
{ 
    [Key] 
    public string Username { get; set; } 
    public UserType UserType { get; set; } 
    public string Email { get; set; } 
    public string Name { get; set; } 
    public virtual BranchOffice BranchOffice { get; set; } 
} 

public class BranchOffice 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
+0

だけ_db' 'に' currentUser.BranchOffice'を添付し、おそらくあなたのケースで、インスタンスを取得する必要はありません'_taskService'から取得します。 –

+0

BranchOffice = _db.BranchOffices.Find(branchOffice) –

+0

私はそれが同じものだと思った!あなたがた両方に感謝します。 –

答えて

0

あなたはDbSet EFにEntityを追加すると、自動的にデータベースの一部ではないすべての関連エンティティを追加します。あなたのコードで

_taskServiceは、EFは、指定されたBranchOfficeで新しいUserを追加します_dbコンテキストを使用してデータベースからBranchOfficeを読み込む場合は、

BranchOffice = _taskService.GetBranchOfficeById(branchOffice) 

_db.SaveChanges(); 
  1. 中に3種類のケースを持つことができます。
  2. _taskServiceが異なるコンテキストを使用してデータベースからBranchOfficeを読み取る場合、EFは例外をスローします。
  3. _taskServiceは、(任意のコンテキスト外で、あなたは_dbコンテキストにBranchOfficeを添付していない)新しいBranchOfficeを作成する場合、EFはBranchOfficeを取得し、データベースにBranchOfficeを挿入します。 Idデータベースから、メモリUserを更新し、Userをデータベースに挿入します。

第三は、(あなたは= 5 IdBranchOfficeを持っていなかったが、EFは、それを作成した)

+0

はい、3番目のケースは私のものです。ありがとうございました! –

関連する問題