2015-09-04 79 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; 
    } 
} 

希望這有助於!