2011-10-31 48 views
0

我需要知道我在做什麼錯誤,因爲生成的查詢與數據庫表的屬性不匹配,我認爲我的類是良好的類型,也是映射。這裏是我的代碼使用實體框架生成的錯誤查詢

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]; 

這裏是我的數據庫上下文類

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); 
    } 
} 

我的數據庫表

database Table

+0

我不確定,但EF4.1 DbContext的東西是嚴重的名稱和名稱模式的基礎上,我會建議丟棄'_FK'後綴。 –

回答

2

實體框架不會將您的媒體資源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; } 
    
  • 定義FK財產流利的API:

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

我寧願第一選擇,因爲你的主鍵屬性映射依賴於約定,無論如何,所以這將是後續遵循的約定外鍵屬性也是如此。

0

我相信你能解決這個問題容易,因爲添加數據標註它提醒你的主鍵。

[Key] 
public int ID 

默認情況下EF將嘗試匹配ClassnameId爲關鍵,如果沒有找到,它會嘗試和匹配ID爲關鍵,否則會拋出異常。它是區分大小寫的。因此,如果您想使用大寫字母ID,則需要使用[Key]註釋將其明確標記,以便知道如何映射它。

http://msdn.microsoft.com/en-us/data/gg193958對於一些常見的註釋。