Entity Framework 4.1Code First 连接到 Sql Server 2005

Posted

技术标签:

【中文标题】Entity Framework 4.1Code First 连接到 Sql Server 2005【英文标题】:Entity Framework 4.1Code First connecting to Sql Server 2005 【发布时间】:2011-03-17 22:26:55 【问题描述】:

我正在尝试将 Entity Framework 4.1 RC 与 SQL Server 2005 实例一起使用。我创建了一个空数据库,我想将我的 POCO 对象保存到它。我的 POCO 看起来像:

public class Cart

    public Cart()
    
        this.CartId = Guid.NewGuid();

    

    public Guid CartId  get; set; 
    public decimal TotalCost  get; set; 
    public decimal SubTotalCost  get; set; 
    public decimal Tax  get; set; 
    public decimal EstimatedShippingCost  get; set; 

我的 CartContext 是:

public class CartContext : DbContext

    public DbSet<Cart> Carts  get; set; 
    public DbSet<Attribute> Attributes  get; set; 
    public DbSet<AttributeItem> AttributeItems  get; set; 

我有一个连接字符串:

<add name="CartContext" connectionString="Server=myserver.mynetwork.net;User ID=MyUser;Pwd=mypassword;Initial Catalog=ExistingDb" providerName="System.Data.SqlClient" \>

当我尝试将一个对象添加到上下文并保存它时,我得到:

System.Data.Entity.Infrastructure.DbUpdateException: 更新时出错 条目。请参阅内部异常 细节。 ---> System.Data.UpdateException:一个错误 更新条目时发生。 有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException: 对象名称“dbo.Carts”无效。

如果我配置数据库,我可以看到用户连接,在 sys.tables 中查找数据库运行此查询:

SELECT TOP (1) 
[Extent1].[Id] AS [Id], 
[Extent1].[ModelHash] AS [ModelHash]
FROM [dbo].[EdmMetadata] AS [Extent1]
ORDER BY [Extent1].[Id] DESC 

然后尝试插入我的购物车对象。它从不尝试创建 Carts 表。我猜连接字符串有问题,但我在任何地方都找不到有关如何执行此操作的示例。

【问题讨论】:

在关闭连接字符串时,您有一个反斜杠,但它应该是一个正斜杠,即 /> 而不是 \> 【参考方案1】:

DbContext 不会仅仅因为它不存在而创建表。使用现有数据库后,您还必须手动创建表或创建自定义初始化程序。默认初始化程序只能删除数据库并使用所有必需的表创建新数据库。

例如,您可以调用:

context.Database.Delete();
context.Database.Create();

或者:

context.Database.CreateIfNotExists();

或者:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<MyContext>());
// You don't need to call this. Initialization takes place anyway if context 
// needs it but you can enforce initialization for example in the application 
// startup instead of before the first database operation
context.Database.Initialize(true); 

【讨论】:

很好的答案,谢谢。不幸的是,目前这对我们不起作用,因为我们有一个我想添加的现有方案。 DropCreateDatabaseIfModelChanges 将放弃现有的方案,这是个坏消息!可惜他们没有在模式级别而不是在整个数据库中实现这一点。我喜欢先使用代码,它好多了。我猜答案是编写我自己的初始化程序。

以上是关于Entity Framework 4.1Code First 连接到 Sql Server 2005的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 4.1Code First 连接到 Sql Server 2005

Entity Framework 4.1 Code First 关系中的更改通常不需要

Entity Framework 4.1 Code First - 插入非主键时自动递增字段

我应该如何在 MVC3 中使用 Code First Entity Framework (4.1) 声明外键关系?

virtual 关键字在 Entity Framework 4.1 POCO Code First 中可以产生啥影响?

Entity Framework 4.1 Code First,一对一,一个表连接到复合键的单个键字段