Сопоставление с уже существующей таблицей базы данных

Я использую Entity Framework 4.1 code first подключиться к уже существующей базе данных. Таблица, которую я использую первой, называется Bank, у меня тоже есть Bank class как модель моего домена. Вот как я сопоставил свой класс и таблицу:

public class HbfContext : DbContext
{
     public DbSet<Bank> Banks { get; set; }

     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
          modelBuilder.Entity<Bank>().ToTable("Bank");
     }
}

Мой банковский стол:

BankID INT
BankName VARCHAR(50)

Мой банковский класс выглядит так:

public class Bank
{
     public int Id { get; set; }
     public string Name { get; set; }
     public bool IsActive { get; set; }
}

У меня возникают проблемы, когда я хочу вернуть все банки. Оператор SQL возвращается из:

return db.Banks
     .OrderBy(x => x.Name);

является:

SELECT
     [Extent1].[Id] AS [Id],
     [Extent1].[Name] AS [Name],
     [Extent1].[IsActive] AS [IsActive]
FROM
     [dbo].[Bank] AS [Extent1]
ORDER BY
     [Extent1].[Name] ASC

Это не сработает, потому что в моей таблице нет столбцов Id, Name и IsActive. Как бы это исправить и EF автоматически сопоставил бы BankId с Id и BankName с именем?

3 ответа

Решение

Вы должны дать команду EF игнорировать IsActive собственность и карта других свойств. Если вам не нравятся аннотации данных, вы можете сделать это с помощью свободного API:

modelBuilder.Entity<Bank>().Ignore(b => b.IsActive);
modelBuilder.Entity<Bank>().Property(b => b.Id).HasColumnName("BankID");
modelBuilder.Entity<Bank>().Property(b => b.Name).HasColumnName("BankName");

Попробуйте добавить следующий атрибут в свойство IsActive и посмотрите, поможет ли это

[NotMapped]

ОБНОВИТЬ

Используйте аннотации данных вместо свободного API, который легче понять и использовать IMO

Прежде всего удалите функцию OnModelCreating из вашего контекстного класса

Затем определите свою модель следующим образом

[Table("Bank")]
public class Bank
{
    [key]
    public int Id { get; set; }
    [Column("BankName")]
    public string Name { get; set; }
    [NotMapped]
    public bool IsActive { get; set; }
}

Это должно работать как ожидалось

Вы можете использовать System.ComponentModel.DataAnnotations, чтобы сопоставить имена свойств с соответствующими именами в существующей таблице, например

    [Column("BankID")]
    [Required]
    public string Id
        {
        get;
        set;
        }
Другие вопросы по тегам