2017-12-15 33 views
0

UserId 열을 추가하려는 기존 테이블이 Projects인데, UserId은 외래 키입니다. Projects 지금은 이름 목록이 있지만 각 사용자가 자신의 프로젝트를 관리하고 싶습니다. 나는 목록을 수동으로 정리할 수있을 정도로 목록이 작아서 처음에는 "고아"를 갖는 것이 좋습니다. 내가 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; } 
} 

마이그레이션 :

이 오류

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

로 업데이트 데이터베이스를

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

를 실행할 때이 SQL로 변환 그리고 실패

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

내가 뭘 잘못하고 있니?

당신이 원하기 때문에 아래 Project

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

에 null 허용 FK를 문제의 원인이되는 라인은, 생성 된 마이그레이션이 이미 힌트를 가지고

+0

@HaraldCoppoolse 그게 전부입니다. 고맙습니다. 나는 그걸 놓쳤다는 것을 믿을 수 없습니다. 너는 피곤하지 않을 것이다!그걸 답으로 추가 할 수 있습니까? 답변을 표시 할 수 있습니까? – Joe

답변

1

:

nullable: false, 

그냥 그 라인을 삭제 귀하의 Configure 방법에 따라 작동해야합니다. Remove-Migration을 실행 한 다음 추가 마이그레이션을 다시 실행하여 마이그레이션을 제거해야 할 수도 있습니다. 이 시간이 있어야한다 : 좋아요

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) 인 경우에도 : 당신이 원하는 경우

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

, 당신은 당신의 관계를 구성하는 동안 IsRequired 설정을 명시하여 더 구체적 일 수있다 EF는 규칙을 올바르게 작성하기 위해 규칙을 사용합니다. 실제로 구성을 읽고 실제 Project 클래스에 가지 않아도 알 수있는 사람에게는 여전히 유용합니다. 기능 구성에

0

다음을 지정합니다

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

는 그 사용자 아이디가 null하지 않을 수 있다는 것을 의미하지 않습니다? 그러나 null이되기를 원하십니까?