Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在实体框架对象中使用外部对象_C#_Entity Framework_Entity Framework 5 - Fatal编程技术网

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

C# 在实体框架对象中使用外部对象,c#,entity-framework,entity-framework-5,C#,Entity Framework,Entity Framework 5,我试图使用实体框架来存储和检索一些对象,其中一个属性是我无法控制的类 为了说明这个问题,假设我正在尝试持久化Arc对象: class Arc { public Angle start { get; set; } public Angle end { get; set; } // ... other properties ... } 但是我没有对Angle源代码的写访问权限,它有一个公共接口,类似这样: class Angle { public enum Unit { R

我试图使用
实体框架
来存储和检索一些对象,其中一个属性是我无法控制的类

为了说明这个问题,假设我正在尝试持久化
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
}
public float start_degrees { get { return start.Degrees; }
                              set { start = new Angle(value, Angle.Degrees); }
                             }
我假设我可以在DbContext的
OnModelCreating()
方法中执行一些操作,将角度字段映射到数据库中的浮点列,但尽管阅读了
MSDN
文档,我仍然无法确定要完成此操作需要做些什么

我需要在存储对象时读取角度的度(或弧度)属性,然后在检索对象时使用该值构造一个新的
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
}
public float start_degrees { get { return start.Degrees; }
                              set { start = new Angle(value, Angle.Degrees); }
                             }

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

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

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中更改数据库集的配置时,您可以设置以下内容:

    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");
    }
}
类MyNewConfigurationType:EntityTypeConfiguration
{
公共MyNewConfigurationType()
{
忽略(y=>y.start);
忽略(y=>y.end);
属性(x=>x.start.Degrees);
属性(x=>x.end.Degrees);
}
}

谢谢你的回复,但我认为这并不能解决我的问题。如果我理解正确的话,您是建议我将现有的Angle类封装在一个I control中,但不幸的是,在这种情况下,这并不实际(有很多这样的类,它们不像我构建的Angle示例那么简单)。我希望在读/写数据库时可以插入一个转换方法或类似于“(反)序列化”的方法。(双浮点数只是我的问题中的一个错误;假设所有的问题都是相同的精度。我会更新我的问题)。啊,好的。这似乎是解决方案的一半——据我所知,您的解决方案将把角度写入数据库,作为度数,这是完美的。但是反过来呢?读取数据时,我的根对象需要以正确构造的Angle属性结束,因此在某个时候,Angle构造函数需要使用正确的参数调用。