Сопоставление с уже существующей таблицей базы данных
Я использую 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;
}