2015-09-04 80 views
4

我有一个Point类:实体框架6与不可变类

// My immutable Point class 
public class Point 
{ 
    private readonly Distance _x; 
    private readonly Distance _y; 
    private readonly Distance _z; 

    public Distance X 
    { 
     get { return _x; } 
    } 

    public Distance Y 
    { 
     get { return _x; } 
    } 

    public Distance Z 
    { 
     get { return _x; } 
    } 

    // Ok, so this isn't immutable... but it's purely for EF 
    public int DatabaseId { get; set; } 

    public Point(Distance x, Distance y, Distance z) 
    { 
     _x = x; 
     _y = y; 
     _z = z; 
    } 
} 

Distance是存储单元和值自定义类。)

这是伟大的。我们爱不变。但是Entity Framework不会认识到我需要将X,Y和Z放入数据库中,因为它们没有setter。而他们不应该,因为这是一个不可改变的阶级。甚至不应该有一个private set

我有这样的代码建立我的模型:

modelBuilder.Entity<Point>() 
     .HasKey(point => point.DatabaseId); 

有什么办法来保存这个类的真正的永恒,但也让这个EF6便可访问和存储这些值?提前致谢。

+1

这可能有点挑剔,但不应该是一个结构?你不应该将EF映射到一个可变类,然后用它来创建你的结构对象吗?看起来你正在试图将一个方形的钉子插入一个圆孔。 –

+1

不存在不可变的数据库行。如果你需要一个不可变的对象,你可能需要一个从数据实体层到你的不可变类型所在层的映射层。 – xxbbcc

+0

只适用于私人二传手。但是还有更多的担忧。数据模型应该是什么样子?你可以有一个'Point'表,有三个FK到'Distance',但是你如何确保三个'Distance'总是被一个'Point'引用(而不是任何其他'Point's,我想这就是你想要什么)。 –

回答

0

据我所知,EF会将_xX存储在表格中,因此您必须使用私人设置器将其公开。

除了EF必须能够设置的主键以外,它们仍然是不可变的。

或者,您可以添加另一个图层:不可变类和EF表模型类,并且当您从数据库中拉取数据时,您将获得一个不可变对象,而可变数将隐藏在DAL之外。

0

在类似的情况下,我必须创建一个私人无参数构造函数,EntityFramework可以使用并使Idprivate set。这对我来说工作得很好,这是我在保持课程不变的时候最好的。

所以你的情况,上面的类可以被更新,并简化如下:

public class Point 
{ 
    public Distance X { get; private set; } 
    public Distance Y { get; private set; } 
    public Distance Z { get; private set; } 
    public int DatabaseId { get; private set; } // DatabaseId can't be set publicly 

    private Point() { } // Parameterless constructor for EntityFramework 

    public Point(Distance x, Distance y, Distance z) 
    { 
     X = x; 
     Y = y; 
     Z = z; 
    } 
} 

希望这有助于!