在实体框架对象中使用外部对象

时间:2012-11-13 10:11:23

标签: c# entity-framework entity-framework-5

我正在尝试使用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文档,我还是无法弄清楚我需要做些什么来实现这一目标。

我在某种程度上需要在存储对象时读取角度的度数(或Radians)属性,然后在检索它们时使用该值构造新的Angle。我怎么能这样做?

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

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

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

1 个答案:

答案 0 :(得分: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");
    }
}