2017-12-15 23 views
0

UserId列を追加したい既存のテーブルProjectsがあります。UserIdは外部キーです。 Projectsは現在、名前のリストを持っていますが、私は各ユーザが自分のプロジェクトを管理したいと考えています。私はそれらを手動できれいにすることができるくらいリストが小さいので、最初は "孤児"を持つことでOKです。私はUserIdとナビゲーションプロパティUser含めるように私のモデルを更新したEFコアに外部キー列を追加

public class Project : Entity 
{ 
    public string Name { get; set; } 
    public Guid? UserId { get; set; } //tried this as nullable and non nullable 
    public User User { get; set; } 
} 

(ここではおそらく関係ありませんが、EntityIdDateModifiedと基底クラスである)そして、私の関連するマッピングファイルは

public class ProjectMap : IEntityTypeConfiguration<Project> 
{ 
    public void Configure(EntityTypeBuilder<Project> builder) 
    { 
     builder.Property(x => x.Name).IsRequired(); 
     builder.Property(x => x.UserId).IsRequired(); 

     builder.HasOne(x => x.User) 
      .WithMany(x => x.Projects) 
      .HasForeignKey(x => x.UserId) 
      .OnDelete(DeleteBehavior.SetNull); //I have tried numerous combinations of things here.... 
    } 
} 
です

また、プロジェクトのためにUserエンティティにナビゲーションプロパティを追加しましたが、マッピングclを変更しませんでしたお尻。

public class User : Entity 
{ 
    public string EmailAddress { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public List<Task> Tasks { get; set; } 
    public List<Project> Projects { get; set; } 
} 

このから生成されます移行:

protected override void Up(MigrationBuilder migrationBuilder) 
    { 
     migrationBuilder.AddColumn<Guid>(
      name: "UserId", 
      table: "Projects", 
      nullable: false, 
      defaultValue: new Guid("00000000-0000-0000-0000-000000000000")); 

     migrationBuilder.CreateIndex(
      name: "IX_Projects_UserId", 
      table: "Projects", 
      column: "UserId"); 

     migrationBuilder.AddForeignKey(
      name: "FK_Projects_Users_UserId", 
      table: "Projects", 
      column: "UserId", 
      principalTable: "Users", 
      principalColumn: "Id", 
      onDelete: ReferentialAction.SetNull); 
    } 

更新データベース

ALTER TABLE [Projects] ADD CONSTRAINT [FK_Projects_Users_UserId] FOREIGN KEY ([UserId]) REFERENCES [Users] ([Id]) ON DELETE SET NULL; 

を実行しているときに、このSQLに変換し、このエラーに

Cannot create the foreign key "FK_Projects_Users_UserId" with the SET NULL referential action, because one or more referencing columns are not nullable.

を失敗しました

私は間違って何をしていますか?

+0

@HaraldCoppoolseそれでした。ありがとうございました。私はそれを逃したとは思えません。あなたは疲れていません。それを回答として追加することができますか?これを答えることができますか? – Joe

答えて

1

以下の行が問題を引き起こしているあなたはまたProject

builder.Property(x => x.UserId).IsRequired(); 

にNULL可能FKを望んでいるので、あなたの生成された移行は、その上にすでにヒントがあります:

nullable: false, 

ちょうどその行を削除しますあなたのConfigureメソッドとそれが動作するはずです。 Remove-Migrationを実行してから、移行を削除してから、再度移行を実行する必要があります。あなたがしたい場合は、あなたの関係を設定している間、あなたはIsRequiredを設定する明示的なことで、より具体的なことができ

protected override void Up(MigrationBuilder migrationBuilder) 
{ 
    migrationBuilder.AlterColumn<string>(
     name: "Name", 
     table: "Projects", 
     nullable: false, 
     oldClrType: typeof(string), 
     oldNullable: true); 

    migrationBuilder.AddColumn<Guid>(
     name: "UserId", 
     table: "Projects", 
     nullable: true); 

    migrationBuilder.CreateIndex(
     name: "IX_Projects_UserId", 
     table: "Projects", 
     column: "UserId"); 

    migrationBuilder.AddForeignKey(
     name: "FK_Projects_Users_UserId", 
     table: "Projects", 
     column: "UserId", 
     principalTable: "Users", 
     principalColumn: "Id", 
     onDelete: ReferentialAction.SetNull); 
} 

private static void ConfigureProject(EntityTypeBuilder<Project> b) 
{ 
    b.Property(x => x.Name).IsRequired(); 

    b.HasOne(x => x.User) 
     .WithMany(x => x.Projects) 
     .HasForeignKey(x => x.UserId) 
     .IsRequired(false) 
     .OnDelete(DeleteBehavior.SetNull); 
} 

私はこれが好きなプロパティが既にNULL可能であるにもかかわらず、この時間は、あなたはこれを持っている必要がありますEFはそれを正しく作成するために規約を使用しますが、実際のP​​rojectクラスに行かなくても設定を読んだり、それについて知っている人にとっては素晴らしいことです。

指定した機能の設定で
0

builder.Property(x => x.UserId).IsRequired(); 

はそれはユーザーIDがnullではないかもしれないという意味ではありませんか?それでも、あなたはそれがnullになりたいですか?

関連する問題