2013-04-23 91 views
0

我最近開始使用ASP.NET MVC和實體框架。錯誤實體框架數據庫已更改

對於現有的數據庫,我試圖將我的類映射到數據庫表。沒有成功。

讓我告訴你我的數據庫表:

- >分類 - > ID(PK) - >標題 - >說明

- >產品 - - > ID(PK) - >名稱 - >描述 - >價格 - >類別(FK - > CategoryTree)

- >CategoriyTree - > ID(PK) - > ParentCategory(FK - >類) - > ChildCategory(FK - >類)

現在,我班的實體框架:

class Products 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public decimal? Price { get; set; } 
    public virtual ICollection<CategoryTree> Category { get; set; } 
} 

class Categories 
{ 
    public int categoriesId { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
} 

class CategoryTree 
{ 
    public int Id { get; set; } 
    public virtual ICollection<Categories> ParentCategory { get; set; } 
    public virtual ICollection<Categories> ChildCategory { get; set; } 
} 

class EFDbContext : DbContext 
{ 
    public DbSet<Products> Products { get; set; } 
    public DbSet<Categories> Categories { get; set; } 
    public DbSet<CategoryTree> CategoryTree { get; set; } 
} 

如果我啓動應用程序時,編譯器警告以下錯誤信息: 模型靠山「EFDbContext」語境已經改變,因爲該數據庫已創建。考慮使用Code First Migrations來更新數據庫(http://go.microsoft.com/fwlink/?LinkId=238269)。

我希望有人能幫助我理解這一點;-)

問候

回答

2

在你的Global.asax.cs的的Application_Start()方法中,添加以下行:

Database.SetInitializer<EFDbContext>(null); 

將從檢查自創建數據庫的更改模型停止實體框架。

+0

你能解釋一下我的變化嗎?他爲什麼這樣做? – Patrik 2013-04-23 20:21:52

+0

這是讓你知道你的模型不同於你的數據庫。當數據庫由EF創建時,這更有意義,然後您添加或刪除了字段或實體。 – ckal 2013-04-23 20:33:33

+0

那麼在我的模型中有一個錯誤? ;-) EF是否檢查屬性名稱,對於示例Id,它知道它是要映射的主鍵? – Patrik 2013-04-23 20:39:29

1

對於現有的數據庫,我會建議使用EF power tool逆向工程來生成POCO類。

+0

它doen't作品與Visual Studio Express版.. – Patrik 2013-04-23 19:58:10

+0

另一種選擇是找知道EF Fluent API,它允許您通過在您的上下文類中重寫OnModelCreating方法來完全控制映射。 – RyanJMcGowan 2013-04-24 00:14:14

1

我可以從模型中的db和Categories.categoriesId的上述信息id Categories.Id(假設沒有錯字)中看到唯一的區別。

同時檢查列的可空性,例如Product.Price在模型中可以爲空,在db中是這樣嗎?

我也可以建議,從您的模型中生成一個與名稱不同的新數據庫,並與現有數據庫進行比較。該數據庫名是在連接字符串中指定的,所以你的DbContext類,並通過在連接字符串添加一個構造函數,

internal class EFDbContext : DbContext 
{ 
    public EFDbContext(string connectionString) : base(connectionString) 
    { 

    }