簡體   English   中英

使用實體框架代碼優先的ASP.NET MVC 3 Web應用程序上的列名ProveedoresID和UsuarioID無效

[英]Invalid column name ProveedoresID and UsuarioID on ASP.NET MVC 3 web app using Entity Framework Code First

我目前正在使用Entity Framework為MVC 3制作Web應用程序,但是我是一個初學者,由於某些原因,我的Visual Studio沒有數據庫優先和模型優先功能,因此我無法使代碼優先映射正常工作。 我有三個模型類:Contacto,Proveedor和Usuario,它們每個都對應於數據庫現有數據庫中的一個表,我想用Code First制作這些類以映射到該數據庫。 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; } 
}

我做了一個控制器和視圖與CRUD方法,但是當代碼獲取到EditorFor為Proveedor在屬性Contacto我得到一個無效的列名稱ProveedorID“與同為UsuarioID。 更改現有數據庫上的表名不能解決此問題,但有時會使“無效列名”錯誤引用到Contacto_ID而不是ProveedorID。 如何在Contacto工作中引用Proveedor和Usuario模型? 以及如何覆蓋自動表映射並手動指定映射? 名稱約定在西班牙語中不能很好地工作,並且不能正確檢測數據庫中是否存在關系。

當您不告訴EF有關實體和屬性如何映射到表名和列名的任何信息時,它將通過遵循許多約定來做出自己的假設。 其中之一是假定外鍵列是被引用實體的名稱, _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告知實體和屬性的數據庫名稱的一種方法是流暢的映射。 您可以在上下文類的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);
    }
}

我只是組成了一些名稱,因為您沒有提到要擁有的數據庫名稱,但是您就知道了。

最后一步是通過在上下文中重寫OnModelCreating將此映射添加到模型中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new ContactoMap());
}

順便說一句,如果您具有ProveedorID類的這些屬性,那么EF還將這些屬性推斷為匹配實體的外鍵。 僅當您不包括這些原始外鍵屬性時,EF才會期望數據庫中帶下划線的列名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM