Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 首先使用实体框架代码的ASP.NET MVC 3 web应用上的列名PROVEDEORESID和USUARIID无效_C#_Asp.net Mvc_Entity Framework_Asp.net Mvc 3 - Fatal编程技术网

C# 首先使用实体框架代码的ASP.NET MVC 3 web应用上的列名PROVEDEORESID和USUARIID无效

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 {

我目前正在使用Entity Framework为MVC 3制作一个web应用程序,但我是一个初学者,无法使代码优先映射正常工作,并且由于某些原因,我的Visual Studio没有数据库优先和模型优先功能。 我有三个模型类:Contacto、Proveedor和Usuario,它们中的每一个都对应于现有数据库上的一个表,我想先用代码将这些类映射到这个数据库。Contacto与Proveedor和Usuario有一对一的关系。我这样声明模型类:

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;}
to
public Usuario Usuario{get;set;}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new ContactoMap());
}