我想通过避免在我的代码中包含两组实体来节省一些工作。到目前为止,我有第一组,它只是 EF 的一堆虚拟代理实体,具有默认构造函数和可设置属性,因此它可以映射到它们。另一个是我在业务代码中使用的一组真实实体。真实的是不可变的,并且在使用初始化构造函数创建时完全初始化。
有没有办法通过使用 EF 中的某种工厂来避免代理并直接映射到真实实体,这些工厂能够在不使用可设置属性的情况下处理初始化构造函数?
我想通过避免在我的代码中包含两组实体来节省一些工作。到目前为止,我有第一组,它只是 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;
}
}