Как я могу сопоставить свойство массива с полем DB строки с разделителями, используя EF? - PullRequest
3 голосов
/ 05 февраля 2011

У меня есть объект со свойством массива, который я хочу сохранить в базе данных в виде строки с разделителями.Как сопоставить это свойство с полем в базе данных и наоборот?

public class User() {
  public int Id { get; set; }
  public string[] Roles { get; set; }
}

Incomplete Config Class:

public class UserConfig : EntityTypeConfiguration<User> {
  public UserConfig() {
    this.Property(u => u.Roles).__???__
    this.Map(u => u.Properties<string[]>(r => r.Roles).__???__))
      .HasColumnName("roles");
  }
}

В этом примере свойство "Roles" будет преобразовано в"roleA, roleB, roleC" при переходе в базу данных, а затем преобразовывается обратно в массив при чтении из базы данных.Есть ли где-нибудь событие отображения данных?

Ответы [ 2 ]

5 голосов
/ 06 февраля 2011

Вам необходимо дополнительное свойство, которое упаковывает и преобразует String в String[].

public class User() {
  public int Id { get; set; }
  public string Roles { get; set; }
  public string[] RolesArray 
  { 
    get
    {
      return Roles.Split(',').ToArray();
    }
    set
    {
      Roles = String.Join(',', value);
    }
  }
}

Конечно, предпочтительным решением было бы добавить новую таблицу в вашу базу данных с именем Role и иметь отношение один-много, так что User имеет много Roles. Это позволит EF управлять всем за вас, а значит, ваши данные хранятся согласованно и доступно. Строки с разделителями-запятыми не особенно приятны для работы и не должны храниться в базах данных.

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

Вы должны предоставить дополнительное свойство, которое будет реализовывать логику преобразования между строкой и массивом.Вы отобразите это свойство и проигнорируете свойство Roles.

...