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

时间:2014-06-20 16:10:10

标签: c# asp.net-mvc entity-framework

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

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

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

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

遗憾的是,规范化数据库不是一种选择,它正被其他应用程序主动使用。

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

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

有关实现这一目标的好方法的任何建议吗?

2 个答案:

答案 0 :(得分:0)

您应该可以使用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");


    }
}

答案 1 :(得分:0)

我认为你应该只是map this flag column to corresponding flag entity对象而不改变任何数据,实体框架支持自第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>