7

コードに 2 セットのエンティティが含まれないようにすることで、作業を節約したいと考えています。これは、デフォルトのコンストラクターと設定可能なプロパティを備えた EF の単なるダミー代理エンティティであり、それらにマップできます。もう 1 つは、ビジネス コードで使用する実際のエンティティのセットです。実際のものは不変であり、初期化コンストラクターを使用して作成された時点で完全に初期化されます。

設定可能なプロパティを使用せずにコンストラクターの初期化を処理できる EF のある種のファクトリを使用して、サロゲートを回避し、実際のエンティティに直接マップする方法はありますか?

4

2 に答える 2

6

EF にはパラメーターなしのコンストラクターが必要であり、プロパティを設定できる必要があります。

より良いカプセル化のために、プロパティ セッターを作成できますprotected。EF は引き続き (生成されたプロキシを介して) プロパティ値を設定できますが、外部の観点からは不変に見えます。

于 2013-10-10T19:37:31.027 に答える
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;
    }
}
于 2015-09-03T14:13:51.380 に答える