簡體   English   中英

使用實體框架生成錯誤的查詢

[英]Wrong query generated with entity framework

我需要知道我做錯了什么,因為生成的查詢與數據庫表的屬性不匹配,我認為我的類是良好的類型,也是映射。 這是我的代碼

public class Usuario
{
    #region Atributos
    private int _intID = 0;
    private Perfil _Perfil_FK = null;
    private String _strNombre = "";
    private String _strPassword = "";
    #endregion

    #region Propiedades

    public int ID
    {
        get { return _intID; }
        set { _intID = value; }
    }

    public Nullable<int> IDPerfil_FK { get; set; }

    public virtual Perfil Perfil_FK
    {
        get { return _Perfil_FK; }
        set { _Perfil_FK = value; }
    }
    public String Nombre
    {
        get { return _strNombre; }
        set { _strNombre = value; }
    }
    public String Password
    {
        get { return _strPassword; }
        set { _strPassword = value; }
    }
    #endregion
}

我的測試只是這個_db.Usuario()

生成的SQL查詢

SELECT 
[Extent1].[IDUsuario] AS [IDUsuario], 
[Extent1].[IDPerfil_FK] AS [IDPerfil_FK], 
[Extent1].[Nombre] AS [Nombre], 
[Extent1].[Password] AS [Password], 
[Extent1].[PerfilID] AS [PerfilID] <-- this attribute doesn't exit's
FROM [dbo].[Usuario] AS [Extent1];

這是我的db上下文類

public class MasterPageAtentoDB : DbContext
{
    public DbSet<Pagina> Pagina { get; set; }
    public DbSet<Perfil> Perfil { get; set; }
    public DbSet<Permiso> Permiso { get; set; }
    public DbSet<Usuario> Usuario { get; set; }

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Usuario>().Property(r => r.ID).HasColumnName("IDUsuario");
        modelBuilder.Entity<Pagina>().Property(r => r.ID).HasColumnName("IDPagina");
        modelBuilder.Entity<Permiso>().Property(r => r.ID).HasColumnName("IDPermiso");
        modelBuilder.Entity<Perfil>().Property(r => r.ID).HasColumnName("IDPerfil");
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        base.OnModelCreating(modelBuilder);
    }
}

我的數據庫表

數據庫表

實體框架不會將您的屬性IDPerfil_FK識別為Perfil_FK導航屬性的外鍵屬性,因為您沒有遵循自動FK屬性檢測所需的命名約定。 因此,EF假定IDPerfil_FK是普通的標量屬性,並且Perfil_FK在模型中沒有公開的FK屬性,並且數據庫中的列具有標准名稱Perfil_ID (導航屬性名稱+“_”+目標實體的主鍵屬性名稱類)。

您有三種方法可以解決此問題:

  • 適當地命名FK屬性(導航屬性名稱+目標實體類的主鍵屬性名稱):

     public Nullable<int> Perfil_FKID { get; set; } 
  • 在屬性上放置數據注釋屬性以指示它是FK屬性:

     [ForeignKey("Perfil_FK")] public Nullable<int> IDPerfil_FK { get; set; } 
  • 在Fluent API中定義FK屬性:

     modelBuilder.Entity<Usuario>() .HasOptional(u => u.Perfil_FK) .WithMany() // or with parameter if Perfil class refers back to Usuario .HasForeignKey(u => u.IDPerfil_FK); 

我更喜歡第一個選項,因為主鍵屬性的映射無論如何都依賴於約定,因此它也會遵循外鍵屬性的約定。

我相信你可以解決這個問題,就像添加數據注釋一樣簡單,提醒你注意主鍵。

 [Key]
 public int ID

默認情況下,EF將嘗試匹配ClassnameId作為鍵,如果沒有找到它將嘗試匹配Id作為鍵,否則將引發錯誤。 它區分大小寫。 因此,如果您想使用大寫ID,您需要使用[Key]注釋顯式標記它,以便它知道如何映射它。

http://msdn.microsoft.com/en-us/data/gg193958用於一些常見注釋。

暫無
暫無

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

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