3

オブジェクトの保存と取得に使用しようとしてEntity Frameworkいますが、そのプロパティの 1 つは、制御できないクラスです。

この問題の説明のために、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()メソッドで角度フィールドをデータベースの float 列にマップすることができると思いますが、MSDNドキュメントを読んでも、これを達成するために何をする必要があるかわかりません。

オブジェクトを格納するときに角度の度 (またはラジアン) プロパティをAngle読み取り、それらを取得するときにその値を使用して新しいを構築する必要があります。これどうやってするの?

編集: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 ());
    }

更新 OK、私は構成に深く入り込んでいませんが、これがあなたを正しい方向に導くことを願っています:

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 に答える