Entity Framework и строка как NCLOB в oracle Db

У меня есть эта модель:

public class Teacher
{
    public int TeacherID { get; set; }
    public string Name { get; set: }
    public string Surname{ get; set; }
}

и когда модель сначала запускается, она создает мою таблицу учителей и DbSet, но для имени и фамилии (которые являются строкой) она присваивает столбцу тип NCLOB. Теперь с типом NCLOB я не могу выполнять некоторые операции, такие как равенство или различие в моей таблице....

Как я могу заставить MF установить тип столбца на varchar?


person nicecatch    schedule 17.12.2014    source источник


Ответы (2)


Мне удалось решить проблему, установив максимальную длину строки в модели.

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, которое может содержать до 4 ГБ данных.

Примечание. Максимальная длина для varchar составляет 4000 байт, поэтому мы не можем установить более 2000 в качестве максимальной длины (2 байта на символ с Unicode).

person nicecatch    schedule 18.12.2014
comment
У меня есть int с .ToString() в запросе LINQ, и он использует TO_NCLOB в созданном запросе. Есть ли способ предотвратить это? - person JonathanPeel; 05.05.2017
comment
@JonathanPeel Если int доступно вне запроса LINQ, вы можете преобразовать int в локальную строковую переменную вне LINQ и использовать строку в запросе LINQ. - person mike mckechnie; 11.05.2017
comment
Я нашел способ сопоставить методы расширений с функциями Oracle, используя [Function(FunctionType.BuiltInFunction, "TO_CHAR")]. Затем я создал int.ToChar(), и он прекрасно работает. - person JonathanPeel; 11.05.2017
comment
@JonathanPeel Как ты получил эту работу? Кажется, я не могу. Сначала я использую базу данных и имею сгенерированный файл edmx. Это ошибка: указанный метод «System.String ToChar (Int64)» для типа «Acorn.Data.OracleFunctions» не может быть преобразован в выражение хранилища LINQ to Entities. - person dannie.f; 13.05.2017
comment
Сначала я использую код в существующей БД. OracleFunctions — это статический класс с такими членами, как [Function(FunctionType.BuiltInFunction, "TO_CHAR")] public static string ToChar(this int value) => Function.CallNotSupported<string>();. В классе DbContext существует метод с именем OnModelCreating. Там есть строка кода: modelBuilder.Conventions.Add(new FunctionConvention(typeof(OracleFunctions))); - person JonathanPeel; 13.05.2017
comment
При использовании БД файлы кода генерируются инструментом, поэтому не рекомендуется их изменять. Класс DbContext может быть partial. Если это так, вы можете создать еще один partial class с тем же именем в другом файле. Это не будет переопределено, если вы обновите файл edmx. - person JonathanPeel; 13.05.2017
comment
Если вы не подходите, дайте мне знать, и я вышлю вам образец. В комментариях сложно объяснить. - person JonathanPeel; 13.05.2017
comment
@JonathanPeel Я не знал, что библиотека работает только с Code First. Преобразовано в Code First и добавлено FunctionConvention в OnModelCreating, и теперь оно работает. Спасибо. - person dannie.f; 13.05.2017

Попробуйте настроить его явно:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Teacher>().Property(x => x.Name).HasColumnType("varchar");
    modelBuilder.Entity<Teacher>().Property(x => x.Surname).HasColumnType("varchar");
}

См. документацию< /а>

person haim770    schedule 17.12.2014
comment
Мне удалось решить это «правильным способом». Я опубликую ответ, но все равно спасибо за усилия! - person nicecatch; 18.12.2014
comment
только должно быть varchar2? - person Toolkit; 15.01.2017