Entity Framework 4.1Code Первое подключение к Sql Server 2005 - PullRequest
6 голосов
/ 18 марта 2011

Я пытаюсь использовать 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 Ответ

8 голосов
/ 18 марта 2011

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); 
...