C# 首先使用实体框架代码的ASP.NET MVC 3 web应用上的列名PROVEDEORESID和USUARIID无效
我目前正在使用Entity Framework为MVC 3制作一个web应用程序,但我是一个初学者,无法使代码优先映射正常工作,并且由于某些原因,我的Visual Studio没有数据库优先和模型优先功能。 我有三个模型类:Contacto、Proveedor和Usuario,它们中的每一个都对应于现有数据库上的一个表,我想先用代码将这些类映射到这个数据库。Contacto与Proveedor和Usuario有一对一的关系。我这样声明模型类:C# 首先使用实体框架代码的ASP.NET MVC 3 web应用上的列名PROVEDEORESID和USUARIID无效,c#,asp.net-mvc,entity-framework,asp.net-mvc-3,C#,Asp.net Mvc,Entity Framework,Asp.net Mvc 3,我目前正在使用Entity Framework为MVC 3制作一个web应用程序,但我是一个初学者,无法使代码优先映射正常工作,并且由于某些原因,我的Visual Studio没有数据库优先和模型优先功能。 我有三个模型类:Contacto、Proveedor和Usuario,它们中的每一个都对应于现有数据库上的一个表,我想先用代码将这些类映射到这个数据库。Contacto与Proveedor和Usuario有一对一的关系。我这样声明模型类: public class Contacto {
public class Contacto
{
public int ID { get; set; }
public string Nombre { get; set; }
public string Telefono { get; set; }
public Proveedor ProveedorID { get; set; }
public Usuario UsuarioID { get; set; }
}
public class Proveedor
{
public short ID { get; set; }
public string NombreProveedor {get;set;}
}
public class Usuario
{
public short ID { get; set; }
public string NombreUsuario {get;set;}
}
上下文类如下所示:
public class Contexto : DbContext
{
public DbSet<Contacto> Contactos { get; set; }
public DbSet<Proveedor> Proveedores { get; set; }
public DbSet<Usuarios> Usuarios { get; set; }
}
公共类Contexto:DbContext
{
公共数据库集联系人{get;set;}
公共数据库集证明文件{get;set;}
公共DbSet Usuarios{get;set;}
}
我用CRUD方法创建了一个控制器和视图,但当代码进入Contacto
中的Proveedor
属性的编辑器时,我得到了一个无效的列名“ProveedorID”,对于UsuarioID也是如此。更改现有数据库上的表名并不能解决此问题,但有时会导致无效列名错误,请参考Contacto_ID而不是ProveedorID。
如何在Contacto工作中参考Proveedor和Usuario模型?以及如何覆盖自动表映射并手动指定映射?名称约定在西班牙语中无法正常工作,也无法正确检测数据库中是否存在关系。如果您不告诉EF有关实体和属性如何映射到表名和列名的任何信息,EF将按照一些约定进行自己的假设。其中之一是假设外键列是附加有
\u ID
的引用实体的名称
如果不希望EF遵循这些默认约定,则必须添加自己的映射。我将展示一个示例,说明如何做到这一点
首先,我将从引用属性中删除“ID”部分,并将基本外键属性添加到Contacto
类:
public class Contacto
{
public int ID { get; set; }
public string Nombre { get; set; }
public string Telefono { get; set; }
public short ProveedorID { get; set; }
public Proveedor Proveedor { get; set; }
public short UsuarioID { get; set; }
public Usuario Usuario { get; set; }
}
告诉EF实体和属性的数据库名称的一种方法是fluent映射。您可以在上下文类的OnModelCreating
重写中执行此操作,也可以在EntityTypeConfiguration
重写中执行此操作:
public class ContactoMap : EntityTypeConfiguration<Contacto>
{
public ContactoMap()
{
ToTable("tblContacto");
Property(c => c.ProveedorID).HasColumnName("ProveedorId");
HasRequired(x => x.Proveedor).WithMany().HasForeignKey(c => c.ProveedorID);
Property(c => c.UsuarioID).HasColumnName("UsuarioId");
HasRequired(x => x.Usuario).WithMany().HasForeignKey(c => c.UsuarioID);
}
}
顺便说一句,如果您具有类似于
ProveedorID
的属性,EF还将推断这些属性为匹配实体的外键。只有在不包含这些基本外键属性时,EF才会在数据库中使用带下划线的列名。如果将public Proveedor ProveedorID{get;set;}
更改为public Proveedor Proveedor{get;set;}
和public Usuario Usuario id{get;set;}
topublic Usuario Usuario{get;set;}
?
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ContactoMap());
}