【问题标题】:Entity Framework and string as NCLOB on oracle Db实体框架和字符串作为 Oracle Db 中的 CLOB
【发布时间】: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?

【问题讨论】:

    标签: oracle entity-framework code-first asp.net-mvc-5.2


    【解决方案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?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多