2016-03-17 63 views
3

我有如下所示的代碼第一個模型。應用程序創建表'VideoPosts',並且不創建'ImagePosts'。 CoverImage和TileImage導航屬性有問題嗎,還是我錯過了一些東西?我想爲表格提供一個表格,就像表格中的視頻一樣。實體框架代碼先不創建多到許多數據庫表

public class Post 
    { 

     public int PostID { get; set; } 

     [ForeignKey("TileImageID")] 
     public Image TileImage { get; set; } 
     [Column("TileImageID")] 
     public int? TileImageID { get; set; } 
     [ForeignKey("TileImageID")] 
     public Image CoverImage { get; set; } 
     [Column("CoverImageID")] 
     public int? CoverImageID { get; set; } 

     public virtual ICollection<Image> Gallery { get; set; } 
     public virtual ICollection<Video> VideoGallery { get; set; } 
    } 

    public class Video 
    { 
     public int VideoID { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     [Required] 
     public string Url { get; set; } 
     public virtual ICollection<Post> Posts { get; set; } 
    } 

    public class Image 
    { 
     public int ImageID { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     [Required] 
     public string Path { get; set; } 

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

Database created

回答

0

我設法創建一個自定義映射所需的表。 TileImage和CoverImage也在模型中,我認爲模型沒有其他問題。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 
      modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

      modelBuilder.Entity<Post>() 
       .HasMany<Image>(s => s.Gallery) 
       .WithMany(c => c.Posts) 
       .Map(cs => 
       { 
        cs.MapLeftKey("PostID"); 
        cs.MapRightKey("ImageID"); 
        cs.ToTable("PostImages"); 
       }); 
     } 
0

你的一個外鍵的註釋是比我看不出有什麼不對您的DB錯誤等。

[ForeignKey("TileImageID")] 
    public Image TileImage { get; set; } 
    [Column("TileImageID")] 
    public int? TileImageID { get; set; } 
    [ForeignKey("CoverImageID")] 
    public Image CoverImage { get; set; } 
    [Column("CoverImageID")] 
    public int? CoverImageID { get; set; } 
+0

我現在修正註解。爲什麼我不像'VideoPosts'那樣得到一張名爲'ImagePosts'的新表(見圖片)。我想與Post和Image創建多對多的關係。一篇文章有​​很多圖片(圖庫),一篇圖片可以在很多文章中使用。 – vpetrovic

+0

您的數據庫是最新的,即最新的遷移? –

+0

是的,它是最新的,但目前我沒有使用遷移,我刪除數據庫(物理)並將其分離,所以每次運行應用程序時都會從頭開始創建數據庫。從第一行 – vpetrovic

0

嘗試的DataContext把這個:

public DataContext() : base("DatabaseName") 
    { 
     // Database.SetInitializer<DataContext>(new DropCreateDatabaseAlways<DataContext>()); 
     Database.SetInitializer<DataContext>(new CreateDatabaseIfNotExists<DataContext>()); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
    } 

刪除物理數據庫,並嘗試運行應用程序,那麼應用程序將自動創建數據庫,然後你會看到「ImagePosts」。在你的代碼中,我沒有看到任何錯誤

+0

刪除評論並把第二排 – GalaxMan

+0

現在,我得到這些錯誤:MyApp.Models.IdentityUserLogin:的EntityType「IdentityUserLogin」沒有定義鍵。定義此EntityType的關鍵字。 MyApp.Models.IdentityUserRole :: EntityType'IdentityUserRole'沒有定義鍵。定義此EntityType的關鍵字。 IdentityUserLogins:EntityType:EntitySet'IdentityUserLogins'基於沒有定義鍵的類型'IdentityUserLogin'。 IdentityUserRoles:EntityType:EntitySet'IdentityUserRoles'基於沒有定義鍵的類型'IdentityUserRole'。 – vpetrovic

+0

base.OnModelCreating(modelBuilder);必須被調用。但我仍然沒有我想要的桌子。我認爲這個問題不在數據庫娛樂中,也許由於TileImage和CoverImage導航屬性,類模型在某種程度上是錯誤的。 – vpetrovic

0

你的代碼沒有顯示這一點,但從你得到的錯誤我假設你重寫OnModelCreating.This是IdentityDbContext配置實體框架映射的地方。這意味着如果你想重寫OnModelCreating,你需要調用基礎,或者你必須自己做映射。

因此,無論這樣的:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
    } 

,或者你的映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId); 
    modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id); 
    modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId }); 
} 
相關問題