模型第一:如何添加Color类型的属性?

时间:2014-07-15 10:22:36

标签: c# entity-framework ef-model-first

我使用模型优先方法创建新数据库,并且我想在System.Drawing.Color类型的表中添加一列,但我在属性列表中没有此选项

是否有办法使用比可用数据类型更多的数据类型?

2 个答案:

答案 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.026241‌​2224</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'