2013-04-23 76 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) 
    { 

    }