0

關係,我有3個表如下:實體框架 - 3個表有相互

ApplicationUser:

public class ApplicationUser : IdentityUser 
{ 
    ..some basic properties.. 

    // navigation properties 
    public virtual ICollection<Post> Posts { get; set; } 
    public virtual ICollection<Album> Albums { get; set; } 
} 

public class Post 
{ 
     public long Id { get; set; }  
     public string Content { get; set; } 

     public int? AlbumId { get; set; } 
     public string UserId { get; set; } 

     public virtual ApplicationUser User { get; set; } 
     public virtual Album Album { get; set; } 
} 

專輯

public class Album 
{ 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string UserId { get; set; } 

     public virtual ApplicationUser User { get; set; } 
     public virtual ICollection<Post> Posts { get; set; } 
} 

最後ApplicationDbContext

modelBuilder.Entity<ApplicationUser>() 
       .HasMany(a=>a.Posts) 
       .WithRequired(a=>a.User) 
       .HasForeignKey(a=>a.UserId) 
       .WillCascadeOnDelete(false); 
modelBuilder.Entity<Post>() 
       .HasKey(p => p.Id); 

modelBuilder.Entity<Album>() 
       .HasKey(a => a.Id); 

modelBuilder.Entity<ApplicationUser>() 
       .HasMany(u=>u.Albums) 
       .WithOptional() 
       .HasForeignKey(a=>a.UserId) 
       .WillCascadeOnDelete(); 

modelBuilder.Entity<Album>() 
       .HasMany(a=>a.Posts) 
       .WithRequired() 
       .HasForeignKey(p=>p.AlbumId) 
       .WillCascadeOnDelete(); 

當我運行遷移和更新數據庫,我得到一個錯誤:

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_dbo.Posts_dbo.Albums_AlbumId". The conflict occurred in database "aspnet-Link-20161012104217", table "dbo.Albums", column 'Id'.

誰能告訴我,爲什麼他們衝突?這對我來說似乎很合理。

回答

1

在你的代碼設置​​爲nullable但在配置中定義WithRequeired()

public class Post 
{ 
    public long Id { get; set; }  
    public string Content { get; set; } 

    public int? AlbumId { get; set; }  //<-- this one 
    public string UserId { get; set; } 

    public virtual ApplicationUser User { get; set; } 
    public virtual Album Album { get; set; } 
} 

modelBuilder.Entity<Album>() 
      .HasMany(a=>a.Posts) 
      .WithRequired() //<-- this one 
      .HasForeignKey(p=>p.AlbumId) 
      .WillCascadeOnDelete(); 

如果​​是nullable你應該更改配置:

//Ef by default conventions set the AlbumId as foreign key 
modelBuilder.Entity<Album>() 
      .HasMany(a=>a.Posts) 
      .WithOptional(a=>a.Album); 

,如果​​不nullable變化物業:

public class Post 
{ 
    public long Id { get; set; }  
    public string Content { get; set; } 

    public int AlbumId { get; set; }  
    public string UserId { get; set; } 

    public virtual ApplicationUser User { get; set; } 
    public virtual Album Album { get; set; } 
} 

和使用以下配置:

//Ef by default conventions set the AlbumId as foreign key 
modelBuilder.Entity<Album>() 
      .HasMany(a=>a.Posts) 
      .WithRequired(a=>a.Album) 
      .WillCascadeOnDelete(); 
+0

這是沒有問題的。模型構建器將始終覆蓋FK類型。問題在於違反了FK約束,所以有一些帖子沒有相冊(或者不存在)。 – DevilSuichiro

+0

它的作品,非常感謝你,我認爲「WithRequired」意味着每張專輯必須有博客,結果相反 – LaXuanLinh