映射到现有数据库表

Entity Framework 4.1 code first使用Entity Framework 4.1 code first连接到现有的数据库。 我首先使用的表叫做Bank 。 我还有一个Bank class作为我的域模型。 这是我映射我的类和表的方式:

 public class HbfContext : DbContext { public DbSet Banks { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity().ToTable("Bank"); } } 

我的银行表:

 BankID INT BankName VARCHAR(50) 

我的Bank类看起来像这样:

 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吗?

您需要指示EF忽略IsActive属性并映射其他属性。 如果您不喜欢数据注释,可以使用流畅的API执行此操作:

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

尝试将以下属性添加到IsActive属性,看看它是否有帮助

 [NotMapped] 

UPDATE

使用数据注释而不是流畅的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; }