Как сделать преобразование типа свойства в EF 4.1 Code First - PullRequest
5 голосов
/ 14 июня 2011

Я хочу создать первые модели кода EF 4.1 из существующей схемы базы данных SQL, и мне интересно, возможно ли выполнить какое-либо преобразование типов данных свойств.

Например, у меня есть существующая таблица "Foo" с таким полем:

isTrue char(1) 'valid values are "Y" or "N"

В моей модели EF 4.1 Code First я хочу преобразовать это поле в логический тип, например:

public class Foo
{
    public bool isTrue { get; set; }  
}

Возможно ли это в EF 4.1 Code First, расширяя DBContext или добавляя дополнительный код в модель или подкласс EntityTypeConfiguration <>? Если да, может кто-нибудь указать мне ссылку или документацию о том, как это сделать? Рефакторинг полей базы данных в настоящее время невозможен.

Ответы [ 3 ]

4 голосов
/ 17 июня 2011

Можно использовать не отображенное поле, являющееся общедоступным, которое использует внутреннее поле, а затем вы можете сначала сохранить и извлечь с кодом, а затем выполнить сопоставление здесь.Это должно быть сделано для каждого поля, которое необходимо преобразовать или, конечно, упростить с помощью вспомогательного метода

internal string YesNo { get; set; }

private bool _bYesNo;
[NotMapped]
public bool bYesNo
{
  get{return (YesNo == "Y") ? true : false;}
  set{_bYesNo = value;YesNo = (bYesNo) ? "Y" : "N";}
}
2 голосов
/ 15 июня 2011

EF не может выполнить преобразование.

Один из возможных обходных путей - заставить EF игнорировать свойство bool и использовать свойство-обертку, которое преобразует true в "Y" и false в "N".


Если вам обычно требуется такая гибкость, я предлагаю вам взглянуть на более зрелые рамки.

Например, NHibernate поддерживает это требование "из коробки", указав YesNo в качестве типа отображения.

1 голос
/ 24 января 2012

У меня была та же проблема, и следующее решение отлично сработало для меня !!

Entity Framework и Oracle Boolean

В моем коде поле таблицы просто выглядит как обычное логическое значение, но в базе данных это символ (1): модель EF преобразует его в «Y» или «N» и сохраняет его в базе данных. Я также делаю тот же трюк для Guid в char (36).

...