2017-03-19 50 views
0

私は、ユーザーが多くのプロジェクトとプロジェクトを持つことができますので、私のUserエンティティは、子ナビゲーションプロパティ「プロジェクト」があり割り当てるユーザーID

asp.net core 
asp.net core identity 
entity framework core 

を使用していますエンティティは1人のユーザナビゲーションプロパティを持っています

public class Project 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public User User { get; set; } 
} 

私もUser.Id.への外部キーである列のユーザーIDが作成されたプロジェクトのSQLテーブルで、その後の移行と私のデータベースを更新

これは、慣例によってすべて自動的に起こります。

しかし、私はちょうど例外を取得関連のuserId

context.Projects.Add(project); 
project.User.Id = userId; // User is null here 
await context.SaveChangesAsync(); 

で新しいプロジェクトを保存します。私はまた書くことができます:

project.User = new User{ Id = userId }; 
await context.SaveChangesAsync(); 

ユーザー全体を再度取得せずにそのユーザーIDだけでそのプロジェクトエンティティを保存するにはどうすればいいですか?

P.S.プロジェクトエンティティで追加のUserIdプロパティを作成すると、名前が 'UserId1'のSQLテーブルに別のUserId列が作成されます。

UPDATE

public class Project 
{ 

    public int Id { get; set; } 
    public string Name { get; set; } 

    public User User { get; set; } 
} 

modelBuilder.Entity<Project>().HasOne(x => x.User).WithMany(p => p.Projects).IsRequired(); 
+0

*例外があります*例外は何ですか? – DavidG

答えて

1

あなたはほとんどそこにいます。あなたがこの順序であなたのコードを使用している場合:

context.Projects.Add(project); 
project.User = new User{ Id = userId }; 
await context.SaveChangesAsync(); 

...あなただけの1行を追加する必要があります。

context.Projects.Add(project); 
project.User = new User{ Id = userId }; 

context.Attach(project.User); 

await context.SaveChangesAsync(); 

今、Entity Frameworkは、ユーザーが既存のユーザであることを知っていて、それが使用されますそのIDprojectの外部キーです。この場合、project.Userは、いわゆるスタブエンティティです。これは、データベースへのラウンドトリップを回避するために使用される不完全なエンティティオブジェクトです。

UserIdProjectに追加することもできます。これは、Project.Userに属する外部キーとしてEFによって選択されます。

+0

アタッチしていただきありがとうございます。私はまた、プロジェクトエンティティにUserIdを追加する前に言ったように試みましたが、私はUserIdと私のプロジェクトテーブルにUserId1カラムを持っています... – Elisabeth

+0

あなたは明示的なマッピング(流暢なマッピング)をお持ちですか? –

+0

いいえ、それは私が最初にチェックしたものですが、UserIdについては何もありません。そのUserId1の後に流暢に変更したのは、modelBuilder.Entity ().HasOne(x => x.User).WithMany(p => p.Projects)のナビゲーションプロパティUser Not Nullを作成したことだけでした。必要とされている();デフォルトでは、UserIdはプロジェクトテーブルのデータベースでNULL可能です。 – Elisabeth

関連する問題