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构造函数需要使用正确的参数调用。