2011-03-17 10 views
6

Estoy intentando utilizar Entity Framework 4.1 RC con una instancia de SQL Server 2005. Creé una base de datos vacía y me gustaría conservar mis objetos POCO en ella. Mi POCO parece:Entity Framework 4.1Código Primero conectándose al servidor SQL 2005

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; } 
} 

Mi CartContext es:

public class CartContext : DbContext 
{ 
    public DbSet<Cart> Carts { get; set; } 
    public DbSet<Attribute> Attributes { get; set; } 
    public DbSet<AttributeItem> AttributeItems { get; set; } 
} 

que tienen una cadena de conexión:

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

Cuando intento y añadir un objeto al contexto y guardarlo I consiga:

System.Data.Entity.Infrastructure.DbUpdateEx ception: Se produjo un error al actualizar las entradas . Consulte la excepción interna para detalles. ---> System.Data.UpdateException: Ocurrió un error al actualizar las entradas. Vea la excepción interna para más detalles. ---> System.Data.SqlClient.SqlException: Nombre de objeto no válido 'dbo.Carts'.

Si la base de datos del perfil que puedo ver al usuario conectarse, busco la base de datos en sys.tables ejecuta esta consulta:

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

A continuación, intenta insertar mi carrito objeto. Nunca intenta crear la tabla de Carts. Supongo que hay algo mal con la cadena de conexión, pero no puedo encontrar ejemplos de cómo hacerlo.

+0

En el cierre de la cadena de conexión que tenga una barra invertida pero debe ser una barra diagonal es decir, /> no \> –

Respuesta

8

DbContext no creará una tabla solo porque no existe. Una vez que esté utilizando la base de datos existente, también debe crear tablas manualmente o crear un inicializador personalizado. Los inicializadores predeterminados solo pueden soltar la base de datos y crear una nueva con todas las tablas requeridas.

Por ejemplo, puede llamada:

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

O:

context.Database.CreateIfNotExists(); 

O:

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); 
+0

Excelente respuesta, gracias. Desafortunadamente, esto no va a funcionar para nosotros en este momento porque tenemos un esquema existente que me gustaría agregar. DropCreateDatabaseIfModelChanges <> va a eliminar ese esquema existente, lo que es una mala noticia. Qué lástima que no implementaron esto en el nivel de esquema en lugar de para toda la base de datos. Me encanta usar el código primero, es mucho más agradable. La respuesta sería escribir mi propio inicializador, supongo. –

Cuestiones relacionadas