我需要知道我做错了什么,因为生成的查询与数据库表的属性不匹配,我认为我的类是良好的类型,也是映射。这是我的代码
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);
}
}
我的数据库表
答案 0 :(得分: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; }
在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);
我更喜欢第一个选项,因为主键属性的映射无论如何都依赖于约定,因此也会遵循外键属性的约定。
答案 1 :(得分:0)
我相信你可以解决这个问题,就像添加数据注释一样简单,提醒你注意主键。
[Key]
public int ID
默认情况下,EF会尝试将ClassnameId作为键匹配,如果没有找到,它会尝试将Id作为键匹配,否则会引发错误。它区分大小写。因此,如果您想使用大写ID,您需要使用[Key]
注释显式标记它,以便它知道如何映射它。