Entity Framework 4.1 Code First连接到Sql Server 2005

6

我希望使用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表。我猜测连接字符串存在问题,但是我无法找到任何关于如何解决此问题的示例。


在关闭连接字符串时,您使用了反斜杠,但应该是正斜杠,即/>而不是>。 - Chris Moutray
1个回答

8

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<>将会删除那个现有的方案,这是一个坏消息!真可惜他们没有在模式级别上实现它,而是针对整个数据库。我喜欢使用Code First,它好多了。我猜答案是要写自己的初始化程序。 - Chris Brent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接