繁体   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