mediumtext / longtext - 实体框架代码首次迁移

时间:2017-08-21 12:47:42

标签: c# mysql database entity-framework ef-code-first

我已经为我的数据库使用了实体框架代码优先迁移,并且在我为数据创建的最新表之一中,我存储了JSON数据,在极少数情况下最多可以存储100,000个字符。我们使用的数据库是MySQL,nvarchar(MAX)不存在,最大长度限制在20,000左右。我想使用MEDIUMTEXTLONGTEXT来存储这个Json数据,但我找不到合适的属性来添加到类中的string属性来执行此操作。

我试过的东西: -

  • [Column(TypeName = "text")]
  • [Column(TypeName = "mediumtext")]
  • [Column(TypeName = "MEXIUMTEXT")]

有趣的是,在迁移运行时使用这些,如果我更改以下任一项,则会生成分部类: -

AlterColumn("dbo.ApiAiItems", "JsonData", c => c.String(unicode: false, storeType: "text"));

...或

AlterColumn("dbo.ApiAiItems", "JsonData", c => c.String(unicode: false));

为...

AlterColumn("dbo.ApiAiItems", "JsonData", c => c.String(unicode: false, storeType: "mediumtext"));

在MySQL数据库表上设置了正确的数据类型。所以问题是让迁移生成正确的类型。

有人可以提出任何建议吗?或者正在编辑部分.CS文件?

提前致谢!

1 个答案:

答案 0 :(得分:0)

您没有指出您正在使用的实体框架版本,但我在OnModelCreating方法中执行类似于以下操作的操作,以基于实体属性反射应用SQL Server数据类型。类似的东西可能适合你。我没有准备好访问MySQL实例进行测试,因此您的里程可能会有所不同。

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        ...
        modelBuilder.Properties<string>()
                .Where(p => p.GetCustomAttributes(true).OfType<ColumnAttribute>().Any(a => a.TypeName.ToLowerInvariant() == "mediumtext"))
                .Configure(p => p.HasColumnType("mediumtext"));

        modelBuilder.Properties<string>()
                .Where(p => p.GetCustomAttributes(true).OfType<ColumnAttribute>().Any(a => a.TypeName.ToLowerInvariant() == "longtext"))
                .Configure(p => p.HasColumnType("longtext"));
        ...
    }