【问题标题】:Entity framework code-first ignores table mapping实体框架代码优先忽略表映射
【发布时间】:2012-05-18 23:02:17
【问题描述】:

我们有一个使用现有遗留数据库的 ef 项目,但使用 ef-migrations 向其中添加新表。对于这些实体,我们使用新模式创建表,以将它们与旧表分开。我们在 db 表上使用类名的复数形式的约定。 但是,当我们添加要映射到遗留表(没有复数表名)的新类时,ef 似乎忽略了映射。 实体类:

public class Aktor:IVersionedEntityWithId
{
    public int Id { get; set; }
    public string Navn { get; set; }
    public byte[] Version { get; set; }
}

映射代码:

    protected virtual void MapAktor(EntityTypeConfiguration<Tilsyn.Domain.Aktor> config){
        config.ToTable("dbo.Aktor");
        config.Property(v=>v.Version).IsConcurrencyToken().IsRowVersion(); 
        config.HasKey(e=>e.Id); 
    }

例外:

System.Data.EntityCommandExecutionException:发生错误时 执行命令定义。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException: 无效的对象名称 'dbo.Aktors'。

似乎生成的 sql 仍然在类名后面加上一个 s 来获取表名。这张照片中缺少什么?我是不是用ToTable方法错了?

更新:将类名更改为表名以外的其他名称时,它似乎可以工作。再次改名后,问题就消失了。是否有 EF 缓存或隐藏的映射文件 somwehere?

【问题讨论】:

  • 顺便说一句:ToTable 具有 2 参数重载来映射表和模式名称:config.ToTable("Aktor", "dbo")。但这可能与您的问题无关。

标签: entity-framework ef-code-first entity-framework-4.3


【解决方案1】:

尝试覆盖 DBContext 子类中的 OnModelCreating() 方法来创建映射。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Tilsyn.Domain.Aktor>().ToTable("dbo.Aktor");
}

【讨论】:

  • 我发现这在我的 sn-ps 中并不明显,但实际上我们正在这样做。
  • 对我来说完全不同
  • 是的,我知道。我使用T4从所有实体类生成一个映射类,sn-p中的方法是从OnModelCreated调用的。相信我:)
  • 好的,当你调试时它被调用了吗?
  • 是的。注意问题的更新;更改类名时,问题就消失了。也许只是一个框架故障。
猜你喜欢
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多