3

我试图用来Entity Framework存储和检索一些对象,其中一个属性是我无法控制的类。

为了描述这个问题,假设我正在尝试持久Arc化对象:

class Arc {
   public Angle start { get; set; }
   public Angle end { get; set; }
   // ... other properties ...
}

但我没有对Angle源代码的写访问权限,它有一个像这样的公共接口:

class Angle {
   public enum Unit { Radians, Degrees };
   public Angle(double value, Unit units); // constructor
   public float Radians() { get; } // returns angle value in radians
   public float Degrees() { get; } // returns angle value in degrees
}

我想我可以在 DbContext 的OnModelCreating()方法中做一些事情来将角度字段映射到数据库中的浮点列,但是尽管阅读了MSDN文档,我还是无法弄清楚我需要做什么来完成这个。

在存储对象时,我不知何故需要读取角度的度(或弧度)属性,然后Angle在检索它们时使用该值构造一个新的。我怎样才能做到这一点?

编辑:我想到了一个糟糕的解决方案,即不映射角度属性,并为每个属性添加一个额外的映射属性来进行转换,如下所示:

public float start_degrees { get { return start.Degrees; }
                              set { start = new Angle(value, Angle.Degrees); }
                             }

但我宁愿避免这种情况,因为我的对象有很多这种性质的属性,所以这意味着添加更多。我希望有一个更简单的解决方案。

4

1 回答 1

1

可能我误解了这个问题,但让我试一试。这个怎么样?

public class MyOwnTypeOfAngle
{

    public MyOwnTypeOfAngle(Angle input)
    {
        this.Radians = input.Radians;
        this.Degrees = input.Degrees;
    }


    public double Radians { get; set; }
    public double Degrees { get; set; }
}

在任何情况下,当您想在 EF 中更改 DbSet 的配置时,您需要设置以下内容:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new MyNewConfigurationType ());
    }

更新 好的,我还没有深入了解配置,但我希望这可以引导您朝着正确的方向前进:

class MyNewConfigurationType : EntityTypeConfiguration<Arc>
 {
    public MyNewConfigurationType()
    {

        Ignore<Angle>(y => y.start);
        Ignore<Angle>(y => y.end);

        Property<float>(x => x.start.Degrees).HasColumnName("myStartDegrees");
        Property<float>(x => x.end.Degrees).HasColumnName("MyEndDegrees");
    }
}
于 2012-11-13T12:32:12.457 回答