Неправильный запрос, сгенерированный с помощью Entity Framework - PullRequest
0 голосов
/ 01 ноября 2011

Мне нужно знать, что я делаю неправильно, потому что сгенерированный запрос не совпадает с атрибутами таблицы базы данных, и я думаю, что у меня был классный тип, а также сопоставления. Вот мой код

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

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

Entity Framework не распознает ваше свойство 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 в Fluent 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 голосов
/ 01 ноября 2011

Полагаю, вы можете исправить это так же просто, как добавить аннотацию данных, предупреждающую об этом, к первичному ключу.

 [Key]
 public int ID

По умолчанию EF будет пытаться сопоставить ClassnameId в качестве ключа, если он не найден, он попытается сопоставить Id в качестве ключа, иначе он выдаст ошибку. Это чувствительно к регистру. Поэтому, если вы хотите использовать Uppercase ID, вам нужно явно пометить его аннотацией [Key], чтобы он знал, как отобразить его.

http://msdn.microsoft.com/en-us/data/gg193958 для некоторых распространенных аннотаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...