如何最好地将字符串数组从遗留数据库映射到EF5属性

本文关键字:数据库 映射 属性 EF5 何最好 字符串 数组 | 更新日期: 2023-09-27 18:09:30

我们需要将数据库中的字符串列(用作值数组)映射到Entity Framework 5中的业务实体列表。

在数据库中,信息存储为长度为12的字符串,其中字符串中的每个字符定义是否启用/禁用某些内容。字符的值为0表示项目被禁用,字符的值为1表示项目被启用。

例如,如果第一项和第二项要启用,其余项禁用,则db中的值将为110000000000。

在业务实体中,我们希望将这些配置表示为列表,以便更容易操作和绑定到表示层,理想情况下,这将由包含索引值和布尔值的对象列表表示,以定义它是否活动。

规范化数据库不是一个选项,它正在被其他应用程序积极使用。

我们也许可以在数据库中创建一个视图并映射到它,或者作为实体中标记为"未映射到数据库"的附加属性来进行转换,但每种属性都有其局限性。

当然,这种情况发生在不止一个地方,所以如果我们可以为这种情况定义一个模式,我们可以在整个项目中重用它,节省一些头发。

有什么好的方法可以做到这一点吗?

如何最好地将字符串数组从遗留数据库映射到EF5属性

您应该能够使用Fluent API实现这一点

我想你就需要这样的东西。

[ComplexType]
public class MagicString
{
    public string key { get; set; }    
    public <IList> YourMagicalList { get; set; }
}
public class Context : DbContext
{    
    public DbSet<SomeConfigurationObject> ConfigurationObjects { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {       
        modelBuilder.Entity<SomeConfigurationObject>().Property(u => u.MagicString.key)
                                   .HasColumnName(""YourColumn");

    }
}

我认为你应该把这个标志列映射到相应的标志实体对象,而不改变任何数据,我相信实体框架从版本4开始支持标志。

    [Flags]
    public enum FlagObject : byte
    {
        One = 1,
        Two = 2,
        Three = 4,
        Four = 8,
        Five = 16,
        Six = 32,
        Seven = 64,
        Eight = 128,
        Nine = 256,
        Ten = 512,
        Eleven = 1024,
        Twelve = 2048,
    }

当在EDM中的Flags中声明时,指定为一个标志:

<EnumType Name="FlagObject" IsFlags="true">
  <Member Name="One" Value="1"/>
  <Member Name="Two" Value="2"/>
...
</EnumType>