我已经为我的数据库使用了实体框架代码优先迁移,并且在我为数据创建的最新表之一中,我存储了JSON数据,在极少数情况下最多可以存储100,000个字符。我们使用的数据库是MySQL,nvarchar(MAX)
不存在,最大长度限制在20,000左右。我想使用MEDIUMTEXT
或LONGTEXT
来存储这个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文件?
提前致谢!
答案 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"));
...
}