实体框架在运行时查询中向表名添加了额外的`s`,如果添加`PluralizingTableNameConvention`以避免额外的`s`则会引发错误

时间:2018-10-15 21:17:09

标签: c# entity-framework entity-framework-6

我有3个表的简单上下文。

数据库表已经存在,但使用代码优先方法。

模型Device.cs是-

 public class Device
    {
        public System.Guid Id { get; set; }
        public string Name{ get; set; }

    }

public class sampledbContext : DbContext
    {
        public sampledbContext ()
           : base("name=sampledbContext ")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

          modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }

        public virtual DbSet<Device> Devices { get; set; }
    }

为避免多余的s,我已在OnModelCreating的上方添加了行,但它给出了错误-

System.InvalidOperationException: 'The model backing the 'sampledbContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).'

数据库已经创建,我尝试在这里使用代码优先方法。 我还没有完成更新数据库。

我尝试做Enable-MigrationUpdate-database,它创建了名称为s的表,就像Devices一样吗?已添加s吗?

2 个答案:

答案 0 :(得分:2)

您已关闭该行中的自动迁移:

Database.SetInitializer<IoTSimulatordbContext>(null);

因此,您将需要手动运行update-database来更新模型(可以通过程序包管理器控制台来运行它)。如果表中有任何数据,由于丢失数据的可能性,迁移可能会失败,在这种情况下,您将需要先从表中删除所有数据,或者制作一个自定义迁移脚本来处理复制数据第一。由于这似乎是一种考验,所以最好从一开始就重新启动迁移项目。

答案 1 :(得分:1)

您可以向这样的Table类添加DataAnnotation来描述Schema和Table名称;

  

[Table(“ Device”,Schema =“ MySchema”)]

这将使您更好地控制命名。