Привязать пользовательский класс к столбцу в базе данных с помощью EF 4 POCO - PullRequest
2 голосов
/ 26 февраля 2011

Я создал класс, назовем его User. В этом классе у меня есть специально созданный класс под названием EMail. Этот класс содержит только строку, которая содержит значение адреса электронной почты и некоторую логику для проверки адреса. Так это выглядит в моем классе User.

public class User{
 public string Name{get;set;}
 public EMailAddress EMail{get;set;}
 ...
}

Теперь я хочу привязать это сообщение к столбцу в моих базах данных, используя код CTP5 EF4. Но я не могу этого сделать, я даже не получаю хорошего исключения, все, что я получаю, это «Исключение прерванного потока», но если я закомментирую свое свойство EMail, оно будет работать хорошо.

Мой класс EMailAddress выглядит следующим образом.

public class EMailAddress
{
    //-- Declaration
    private string _email;

    //-- Constructor
    public EMailAddress(string emailAddress)
    {
        if (emailAddress == null)
            throw new ArgumentNullException(string.Format("Supplied emailaddress can't be null"));
        if (!IsValid(emailAddress))
            throw new ArgumentException(string.Format("'{0}' is not a valid Emailaddress", emailAddress));

       _email = emailAddress;
   }

   //-- Methods
   private static bool IsValid(string emailAddress)
   {
       Regex re = new Regex(Constants.EMAIL_REGULAR_EXPRESSION_PATTERN);
       return re.IsMatch(emailAddress);
   }

   public override string ToString()
   {
       return _email;
   }

   public override bool Equals(object obj)
   {
       if (obj == null)
           return false;

       if (obj is string)
           return _email == (string)obj;

       if(obj is EMailAddress)
           return _email == ((EMailAddress)obj).ToString();

       return false;
   }

   public override int GetHashCode()
   {
       return _email.GetHashCode();
   }

   //-- Operator
   public static bool operator ==(EMailAddress emailAddress, EMailAddress emailAddress2)
   {
       return object.Equals(emailAddress, emailAddress2);
   }

   public static bool operator !=(EMailAddress emailAddress, EMailAddress emailAddress2)
   {
       return !(emailAddress == emailAddress2);
   }
}

И я хочу, чтобы в классе EMailAddress не было общедоступных свойств. Есть ли способ позволить EF использовать метод .ToString (), когда он сохраняет значение в базе данных, и использовать конструктор при загрузке данных из базы данных для заполнения моих объектов.

Спасибо ...

Ответы [ 2 ]

1 голос
/ 26 февраля 2011

Нет, это невозможно. У вас есть два варианта:

  • Добавьте еще одно строковое свойство в свой класс User. Это свойство будет отвечать за возврат электронной почты и настройку электронной почты (создание экземпляра EmailAddress). Это свойство будет отображено. Добавьте [NotMappedAttribute] в свойство EMail. Вы можете играть с видимостью новой недвижимости. В обычном EF вы можете изменить видимость свойства, но я не уверен, возможно ли это и в коде первым.
  • Отображение EMailAddress как сложного типа (пометьте его [ComplexTypeAttribute], но в этом случае вам снова нужно добавить строковое свойство в EMailAddress.
0 голосов
/ 10 августа 2013

Вы можете сопоставить непубличные свойства со столбцами в EF, но API codefirst по умолчанию не поддерживает их "из коробки".Я сделал бесплатный код, который вы можете использовать в своих проектах, чтобы удовлетворить эту потребность.У вас все еще должны быть свойства, но теперь они могут быть защищенными, частными или внутренними.

Подробности здесь http://blogs.msdn.com/b/schlepticons/archive/2011/08/31/map-private-properties-with-ef-fluent-api.aspx

...