2012-01-13 72 views
3

我使用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 

这是行不通的,因为我的表没有编号,名称和IsActive列。我将如何解决这个问题,并将EF映射BankId ID和银行名称自动命名?

回答

5

您需要指示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"); 
+0

没有Id和Name列,你可以在我的表结构中看到。因此,不要更改域模型的属性,将列名映射到通过流利API的属性可能是明智的做法? – 2012-01-13 10:58:56

+0

我错过了这部分。如果您的类声明与您的表格不同,则必须映射所有区别。我修改了我的示例。 – 2012-01-13 11:02:02

2

尝试添加下列属性的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; } 
} 

这应如预期

+1

我看不出这将有助于如果选择的列名不对应表中的列名。 – 2012-01-13 10:45:14

+0

这是为了表明上述财产并不需要映射,并在数据库中不存在....试试这个,它会解决你的问题 – 2012-01-13 10:48:15

+0

你需要做的另一件事是改变你的Name属性为'BankName',以确保它对应的列 – 2012-01-13 10:49:24

0

你可以使用System.ComponentModel.DataAnnotations映射属性名称以匹配您现有的表例如

[Column("BankID")] 
    [Required] 
    public string Id 
     { 
     get; 
     set; 
     } 
+0

这可以通过流利的API来完成吗? – 2012-01-13 10:46:30

+0

是的,我想是这样,尝试添加类似modelBuilder.Entity ().Property(银行=> bank.ID).HasColumnName( “BankID”);到您的DbContext OnModelCreating覆盖。 – 2012-01-13 11:21:34

+0

该代码样式看起来很尴尬 – Thomas 2016-07-15 11:25:21