如何使用EF将数组属性映射到分隔的字符串数据库字段?

jed*_*atu 3 c# orm entity-framework-4 ef4-code-only

我有一个带有数组属性的对象,我希望将其作为分隔字符串保存在数据库中.如何将该属性映射到数据库中的字段,而不是?

public class User() {
  public int Id { get; set; }
  public string[] Roles { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

不完整的配置类:

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

对于此示例,"Roles"属性在转到数据库时将转换为"roleA,roleB,roleC",然后在从数据库读取时转换回数组.某处有数据映射事件吗?

Kir*_*rst 5

您需要一个包装并转换String为a 的附加属性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);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

首选的解决方案当然是将一个新表添加到您的数据库中Role,并且具有一对多关系,以便a User有很多Roles.这将允许EF为您管理所有内容,这意味着您的数据将以连贯和可访问的方式存储.逗号分隔的字符串使用起来不是特别令人愉快,不应存储在数据库中.