有没有办法在实体框架中映射到不可变实体?

时间:2013-10-10 14:48:03

标签: c# entity-framework orm immutability

我想通过避免在代码中使用两组实体来保存一些工作。到目前为止,我有第一组,它只是EF的一组虚拟代理实体,具有默认构造函数和可设置属性,因此它可以映射到它们。另一个是我在业务代码中使用的一组真实实体。在使用初始化构造函数创建时,真实的是不可变的并完全初始化。

有没有办法避免使用代理并通过使用EF中的某些工厂直接映射到真实实体,这些工厂能够在不使用可设置的属性的情况下处理初始化构造函数?

2 个答案:

答案 0 :(得分:6)

这是不可能的,EF需要无参数构造函数,它必须能够设置属性。

为了更好的封装,您可以创建属性设置器protected。 EF仍然可以设置属性值(通过生成的代理),但从外部来看,它看起来是不可变的。

答案 1 :(得分:3)

无法添加评论,所以。现在有可能,因为EF现在可以映射私有属性。并在6.1.3中默认执行(不确定以前的版本)。 示例如下。

class Program
{
    static void Main(string[] args)
    {
        using (var context = new MyContext())
        {
            context.MyImmutableClassObjects.Add(new MyImmutableClass(10));
            context.MyImmutableClassObjects.Add(new MyImmutableClass(20));
            context.SaveChanges();
            var myImmutableClassObjects = context.MyImmutableClassObjects.ToList();
            foreach (var item in myImmutableClassObjects)
            {
                Console.WriteLine(item.MyImmutableProperty);
            }
        }

        Console.ReadKey();
    }
}

public class MyContext : DbContext
{
    public DbSet<MyImmutableClass> MyImmutableClassObjects { get; set; }
}

public class MyImmutableClass
{
    [Key]
    public int Key { get; private set; }

    public int MyImmutableProperty { get; private set; }

    private MyImmutableClass()
    {

    }

    public MyImmutableClass(int myImmutableProperty)
    {
        MyImmutableProperty = myImmutableProperty;
    }
}