c# - framework - Primero la base de datos MVC 4 y EF6: problema con el mapeo
entity framework project example (2)
Estoy siguiendo a lo largo de Pro ASP.NET MVC 4 de Adam Freeman en VS 2010 (descargué la plantilla de MVC 4 en línea). He trabajado con el archivo .edmx anteriormente, pero en el Capítulo 7 él no hace esto. Configuré una cadena de conexión básica con SQL Server en mi archivo web.config dentro de mi proyecto WebUI donde se encuentran mis controladores y vistas. Además, enumeré mis clases de dominio dentro de mi proyecto de Dominio a continuación. El problema viene cuando ejecuto la aplicación. La aplicación no reconoce mi tabla en mi base de datos (dbo.Request) y en su lugar está creando una tabla basada en mi nombre de clase en el espacio de nombres Entidades (por lo que crea una tabla CustRequest) y también crea una tabla _Migration_History. Para evitar esto, agrego la anotación de datos sobre mi clase [Table ("MyTableName")]. No pude entender por qué tuve que agregar esta Anotación de datos. Además, EF me hizo agregar una [Clave] arriba de mi clave principal, que puedo entender porque no tengo una propiedad de ID, pero en el libro no hizo esto. Me preguntaba si me estaba perdiendo algo obvio ya que soy bastante nuevo en MVC. Cualquier ayuda sería apreciada. Estoy trabajando con EF 6. Gracias.
namespace Requestor.Domain.Entities
{
[Table("Request")]
public class CustRequest
{
[Key]
public int RequestId { get; set; }
public string RequestByUserCd { get; set; }
public DateTime RequestDateTime { get; set; }
public DateTime DueDate { get; set; }
}
}
namespace Requestor.Domain.Abstract
{
public interface ICustRequestRepository
{
IQueryable<CustRequest> Request { get; }
}
}
namespace ITRequestHub.Domain.Concrete
{
public class EFDbContext : DbContext
{
public DbSet<CustRequest> Request { get; set; }
}
}
namespace ITRequestHub.Domain.Concrete
{
public class EFCustRequestRepository : ICustRequestRepository
{
private EFDbContext context = new EFDbContext(); //retrieves the data
public IQueryable<CustRequest> Request
{
get { return context.Request; }
}
}
}
Considere intentarlo de nuevo con EF5 si puede, tuve problemas similares al tratar de hacer que EF6 funcione con MVC4 (no pude hacer que el andamiaje funcione tampoco).
O suba hasta las últimas versiones para todo y pruebe MVC5 con EF6 (esto parece funcionar bien)
Te has topado con la parte maravillosa y, a veces frustrante, de EF, sus convenciones. Maravilloso cuando conoce las convenciones, ya que simplifican la vida, pero se siente frustrado cuando siente que el marco está realizando tareas sin su permiso explícito.
En primer lugar, puede encontrar información adicional sobre las convenciones EF6 aquí: http://msdn.microsoft.com/en-gb/data/jj679962.aspx
En su primer punto, hasta donde yo sé, EF toma el nombre de su entidad como el nombre de la tabla que creará en su base de datos. Como ha descubierto, tiene control sobre esto a través del atributo "Tabla", pero también puede controlar su deseo de querer pluralizar los nombres de sus entidades al crear tablas mediante la eliminación de convenciones dentro de su DbContext
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>()
En su segundo punto, no puedo imaginar que requiera un atributo "Clave" adjunto a su campo "RequestId" . La convención aquí es que si el nombre del campo contiene un sufijo de ID (no distingue entre mayúsculas y minúsculas), EF lo incluirá automáticamente como clave principal y si el tipo del campo es un Int o un Guid, se establecerá automáticamente como una columna de identidad de semilla automática.