具有不可变类的实体框架6

Sco*_*y H 5 c# entity-framework immutability entity-framework-6

我有一Point节课:

// 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

(Distance是一个存储单位和值的自定义类.)

那很棒.我们喜欢不变性.但实体框架不会认识到我需要将X,Y和Z放在数据库中,因为它们没有setter.他们不应该,因为这是一个不可改变的阶级.甚至不应该有private set.

我有这个代码构建我的模型:

    modelBuilder.Entity<Point>()
        .HasKey(point => point.DatabaseId);
Run Code Online (Sandbox Code Playgroud)

有没有办法保持这个类的真正不变性,但也可以使EF6可以访问和存储这些值?

Mih*_*scu 0

据我所知,EF 会将 和 存储_xX表中,因此您必须使用私有设置器将它们公开。

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

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