将映射到已存在的数据库表

4

我正在使用Entity Framework 4.1 Code First连接到一个已经存在的数据库。我首先使用的表名为Bank。我还有一个Bank类作为我的领域模型。这是我如何映射我的类和表:

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)

我的 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);

is:

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映射到Name吗?

3个回答

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");

如您所见,我的表结构中没有“Id”和“Name”列。因此,与其更改领域模型的属性,通过流畅的 API 将列名映射到属性是否明智? - Brendan Vogt
我错过了这部分。如果您的类声明与表格不同,您必须映射所有差异。我修改了我的示例。 - Ladislav Mrnka

2
尝试为“IsActive”属性添加以下属性,看看是否有帮助。
[NotMapped]

更新

使用数据注释(Data Annotations)代替流式API(Fluent API),在我看来更易于理解和使用。

首先,从您的上下文类(Context Class)中删除 OnModelCreating 函数。

然后按照以下方式定义您的模型(Model):

[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
如果SELECT语句中的列名与表中的列名不对应,我无法看出这将如何有所帮助。 - Brendan Vogt
这是为了表明该属性不需要被映射,也不存在于数据库中... 试试这个,它会解决你的问题。 - Pankaj Upadhyay
你需要做的另一件事是将你的Name属性更改为BankName,以确保它与相应的列匹配。 - Pankaj Upadhyay
我能否使用Fluent API将列映射到属性,而不是更改我的域名属性? - Brendan Vogt
1
数据注释破坏了实体类(模式)的单一职责原则,是旧的ActiveRecord反模式开发人员的残留。 - Artem A
显示剩余5条评论

0
您可以使用System.ComponentModel.DataAnnotations将属性名称映射到与现有表中的名称相匹配的名称,例如:
    [Column("BankID")]
    [Required]
    public string Id
        {
        get;
        set;
        }

是的,我认为可以这样做,尝试在你的DbContext OnModelCreating重写中添加类似modelBuilder.Entity<Bank>().Property(bank => bank.ID).HasColumnName("BankID");的内容。 - The Ed R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接