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

本文关键字:实体 框架 不可变 映射 有没有 | 更新日期: 2023-09-27 18:34:42

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

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

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

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

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

无法添加注释,所以。现在可以了,因为 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;
    }
}