我使用模型优先方法创建新数据库,并且我想在System.Drawing.Color
类型的表中添加一列,但我在属性列表中没有此选项
是否有办法使用比可用数据类型更多的数据类型?
答案 0 :(得分:12)
此处的另一个选择是使用来自Entity Framework 6 Code First - Custom Type Mapping
的答案public class MyLittlePony {
public string Name { get; set; }
public Int32 Argb {
get {
return Color.ToArgb();
}
set {
Color = Color.FromArgb(value);
}
}
[NotMapped]
public Color Color { get; set; }
}
NotMapped
属性使实体框架不会尝试将Color属性映射到数据库中的列。
答案 1 :(得分:2)
此处的一个选项是拥有ARGB颜色的int
版本:
public class ColorData
{
public int Id { get; set; }
public int Argb { get; set; }
public System.Drawing.Color Color
{
get { return new System.Drawing.Color.FromArgb(this.Argb); }
set
{
if(value!=null)
this.Argb = value.ToArgb();
else
this.Argb = 0;
}
}
}
在映射中,请使用fluent绑定专门忽略Color
属性:
protected void override OnModelCreating(ModelBuilder builder)
{
var colorTable = builder.Entity<ColorData>();
colorTable.HasKey(x => x.Id).HasColumnName("COLOR_ID");
colorTable.Property(x => x.Argb).HasColumnName("COLOR_ARGB");
colorTable.Ignore(x=>x.Color);
colorTable.ToTable("COLOR_DATA");
}
现在,您可以从任何Color的静态方法中存储数据:
ColorData data = new ColorData();
data.Color = Color.Black;
data.Color = Color.FromName("Black");
data.Color = Color.FromArgb( 0xFF000000 );
data.Color = Color.FromArgb( 255, 0, 0, 0 );
评论中选择的一个替代方法是序列化为XML。
上面的代码使用整数,因为它使用原生的,高效的SQL Server数据类型,并且易于维护。
XML版本将占用更多空间,可维护性更低,现在将增加搜索特定颜色的复杂性。展开的System.Drawing.Color
类型如下所示:
<Color>
<A>123</A>
<R>45</R>
<G>67</G>
<B>89</B>
<ScA>0.482352942</ScA>
<ScR>0.0262412224</ScR>
<ScG>0.0561284944</ScG>
<ScB>0.09989873</ScB>
</Color>
哪种搜索蓝色更容易?
对于int
类型,这将是:
SELECT COUNT(1) FROM Customer cust
INNER JOIN Color col
ON cust.FavouriteColorId = color.Id
WHERE col.Argb = 0xFF0000FF
对于XML类型:
SELECT COUNT(1) FROM Customer cust
INNER JOIN Color col
ON cust.FavouriteColorId = color.Id
WHERE col.ArgbXml.value('/Color/A') = N'255'
AND col.ArgbXml.value('/Color/R') = N'0'
AND col.ArgbXml.value('/Color/G') = N'0'
AND col.ArgbXml.value('/Color/B') = N'255'