1

我正在關注VS 2010上Adam Freeman的Pro ASP.NET MVC 4(我在線下載了MVC 4模板)。我以前曾經使用.edmx文件,但在第7章中他沒有這樣做。我在我的控制器和視圖所在的WebUI項目的web.config文件中設置了SQL Server的基本連接字符串。另外,我在下面的Domain項目中列出了我的Domain類。我運行應用程序時出現問題。該應用程序不識別我的數據庫中的表(dbo.Request),而是根據Entities名稱空間中的類名創建一個表(因此它創建了一個CustRequest表),並且它還創建了一個_Migration_History表。爲了防止這種情況,我在我的類[Table(「MyTableName」)]上面添加了Data Annotation。我無法弄清楚爲什麼我必須添加這個數據註釋。此外,EF讓我在我的主鍵上添加了一個[Key],我可以理解,因爲我沒有ID屬性,但在書中他沒有這樣做。我想知道是否因爲我對MVC很新而缺少一些明顯的東西。任何幫助,將不勝感激。我正在使用EF 6.謝謝。MVC 4和EF6數據庫優先:映射問題

namespace Requestor.Domain.Entities 
    { 
     [Table("Request")] 
     public class CustRequest 
     { 
      [Key] 
      public int RequestId { get; set; } 
      public string RequestByUserCd { get; set; } 
      public DateTime RequestDateTime { get; set; } 
      public DateTime DueDate { get; set; } 
     } 
    } 

    namespace Requestor.Domain.Abstract 
    { 
     public interface ICustRequestRepository 
     { 
      IQueryable<CustRequest> Request { get; } 
     } 
    } 

    namespace ITRequestHub.Domain.Concrete 
    { 
     public class EFDbContext : DbContext 
     { 
      public DbSet<CustRequest> Request { get; set; } 
     } 
    } 


    namespace ITRequestHub.Domain.Concrete 
    { 
     public class EFCustRequestRepository : ICustRequestRepository 
     { 
      private EFDbContext context = new EFDbContext(); //retrieves the data 

      public IQueryable<CustRequest> Request 
      { 
       get { return context.Request; } 
      } 
     } 
    }  

回答

0

你碰到的EF,其約定的美妙,有時令人沮喪的。當你意識到這些約定簡化了生活時會感覺很棒,但如果你覺得框架在沒有你的明確許可的情況下正在執行任務,這會讓你感到沮喪。

首先,在EF6約定的附加信息可以在這裏找到:http://msdn.microsoft.com/en-gb/data/jj679962.aspx

在您的第一點,據我所知,EF需要你的實體的名稱,因爲它會創建表的名稱在你的數據庫中。正如你已經發現,你必須通過「表」屬性,在這種控制,但你也可以控制它的想你的DbContext

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>() 

中創建藉助慣例去除表時變複數的實體名稱的願望關於你的第二點,我無法想象你需要一個「Key」屬性附加到你的「RequestId」字段。這裏的慣例是,如果字段名稱包含ID後綴(不區分大小寫),那麼EF會自動將其包含爲主鍵,並且如果字段類型是Int或Guid,它將自動設置爲一個自動種子標識列。

+0

所以,在書中,他提到DbSet <>是映射發生的地方。該屬性的名稱是該表,並且DbSet的類型是要建模的類。這與EF6改變(我正在閱讀EF文章) –

+0

@JayMichael我不認爲這是永遠的情況下,DbSet屬性的名稱映射到您的數據庫中的表名稱。它總是被映射到實體類的名稱。看到這裏:http://msdn.microsoft.com/en-gb/data/jj591583#TableColumn – ProxyTech

+0

似乎這樣做。我加了'protected override void OnModelCreating(DbModelBuilder modelBuilder){modelBuilder.Conventions.Remove (); Database.SetInitializer (null);}'我能夠刪除DataAnnotations。你說的很有意思,也許我錯誤地讀了書中的這段話。 –

1

考慮與EF5重新嘗試,如果可以,我試圖與MVC4 EF6工作的時候遇到過類似的問題(我不能」做腳手架的工作要麼)。

或者去一路攀升到最新版本並試着MVC5與EF6(這似乎很好地工作)