如何最好地将字符串数组从遗留数据库映射到EF5属性
本文关键字:数据库 映射 属性 EF5 何最好 字符串 数组 | 更新日期: 2023-09-27 18:09:30
我们需要将数据库中的字符串列(用作值数组)映射到Entity Framework 5中的业务实体列表。
在数据库中,信息存储为长度为12的字符串,其中字符串中的每个字符定义是否启用/禁用某些内容。字符的值为0表示项目被禁用,字符的值为1表示项目被启用。
例如,如果第一项和第二项要启用,其余项禁用,则db中的值将为110000000000。
在业务实体中,我们希望将这些配置表示为列表,以便更容易操作和绑定到表示层,理想情况下,这将由包含索引值和布尔值的对象列表表示,以定义它是否活动。
规范化数据库不是一个选项,它正在被其他应用程序积极使用。
我们也许可以在数据库中创建一个视图并映射到它,或者作为实体中标记为"未映射到数据库"的附加属性来进行转换,但每种属性都有其局限性。
当然,这种情况发生在不止一个地方,所以如果我们可以为这种情况定义一个模式,我们可以在整个项目中重用它,节省一些头发。
有什么好的方法可以做到这一点吗?
您应该能够使用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>