实体框架和字符串作为 Oracle Db 中的 CLOB
Posted
技术标签:
【中文标题】实体框架和字符串作为 Oracle Db 中的 CLOB【英文标题】:Entity Framework and string as NCLOB on oracle Db 【发布时间】:2014-12-17 11:57:47 【问题描述】:我有这个模型:
public class Teacher
public int TeacherID get; set;
public string Name get; set:
public string Surname get; set;
当 Model First 运行时,它会创建我的 Teachers 表和 DbSet,但对于 Name 和 Surname(它们是字符串),它会将 NCLOB 类型分配给列。 现在,对于 NCLOB 类型,我无法在我的表上执行一些操作,例如等于或不同......
如何强制 MF 将 columntype 设置为 varchar?
【问题讨论】:
【参考方案1】:我已经解决了在模型中设置最大字符串长度的问题
public class Teacher
public int TeacherID get; set;
[StringLength(255, MinimumLength = 3, ErrorMessage = "My Error Message")]
public string Name get; set:
[StringLength(255, MinimumLength = 3, ErrorMessage = "My Error Message")]
public string Surname get; set;
如果没有 StringLength,Orcale 会创建一个 NCLOB 字段,该字段最多可包含 4Gb 的数据。
注意:varchar 的最大长度为 4000 字节,因此我们不能将 MaximumLenght 设置为超过 2000(使用 Unicode 时每个字符 2 字节)
【讨论】:
我在 LINQ 查询中有一个带有 .ToString() 的 int,它在创建的查询中使用 TO_NCLOB。有什么办法可以防止吗? @JonathanPeel 如果 int 在 LINQ 查询之外可用,您可以将 int 转换为 LINQ 之外的本地字符串变量,并在 LINQ 查询中使用该字符串。 我找到了一种将扩展方法映射到 Oracle 函数的方法,使用[Function(FunctionType.BuiltInFunction, "TO_CHAR")]
。然后我创建了一个int.ToChar()
,效果非常好。
@JonathanPeel 你是如何得到这份工作的?我好像不行我首先使用数据库并生成了一个 edmx 文件。这是错误:“无法将类型 'Acorn.Data.OracleFunctions' 上的指定方法 'System.String ToChar(Int64)' 转换为 LINQ to Entities 存储表达式。””
@JonathanPeel 我没有意识到该库仅适用于 Code First。转换为 Code First 并在 OnModelCreating 中添加了 FunctionConvention,它现在可以工作了。谢谢。【参考方案2】:
尝试显式配置:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
modelBuilder.Entity<Teacher>().Property(x => x.Name).HasColumnType("varchar");
modelBuilder.Entity<Teacher>().Property(x => x.Surname).HasColumnType("varchar");
见Documentation
【讨论】:
我已经设法以“正确的方式”解决它。我会发布答案,但无论如何感谢您的努力! 只能是varchar2
?以上是关于实体框架和字符串作为 Oracle Db 中的 CLOB的主要内容,如果未能解决你的问题,请参考以下文章
使用通过 React GUI 触发的实体框架向 DB 添加新条目时出现重复条目
如何使用带有实体框架 6 的 TNS 别名连接到 Oracle DB?
首先通过将类型作为参数传递来动态实例化实体框架数据库中的模型对象