【问题标题】:mediumtext / longtext - Entity Framework code first migrationsmediumtext / longtext - 实体框架代码第一次迁移
【发布时间】:2018-01-29 13:18:23
【问题描述】:

我为我的数据库使用了 Entity Framework Code First Migrations,并且在我为数据创建的最新表之一中,我存储了 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 文件?

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    您没有指明您使用的是哪个版本的实体框架,但我在我的 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"));
            ...
        }
    

    【讨论】:

    • 代码是否让您更接近于您正在寻找的东西?
    • 从那时起我就一直在远离这段代码。下周我会更新,因为我会再次努力。我怀疑这正是我正在寻找的,我看到另一个开发人员在工作中出于另一个原因这样做。
    猜你喜欢
    • 2012-11-29
    • 2016-03-05
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2013-12-29
    相关资源
    最近更新 更多