web-dev-qa-db-ja.com

Entity Framework 6:子オブジェクトを親のリストに追加するか、子のナビゲーションプロパティを親に設定するか

2つのテーブルMailServersMailDomainsを含む既存のデータベースがあります。 MailDomainsには、MailServerIdId主キー列を指す外部キー列MailServersがあります。したがって、ここには1対多の関係があります。

この記事 に従い、Entity Data ModelWizardの「Codefirstfromdatabase」モデルを介してEntityFrameworkPOCOを作成しました。これにより、次の2つのC#クラスが生成されました。

public partial class MailServer
{
    public MailServer()
    {
        MailDomains = new HashSet<MailDomain>();
    }

    public int Id { get; set; }

    public virtual ICollection<MailDomain> MailDomains { get; set; }
}



public partial class MailDomain
{
    public MailDomain()
    {
    }

    public int Id { get; set; }

    public string DomainName { get; set; }

    public int MailServerId { get; set; }
    public virtual MailServer MailServer { get; set; }
}

ここで私の質問は、新しいオブジェクトを作成してデータベースに挿入する次の2つのアプローチに違いがあるかどうかです。

アプローチ(A):親のリストに新しい子を追加する:

        var mailServer = new MailServer();
        var mailDomain = new MailDomain() {
            DomainName = "foobar.net",
        };
        mailServer.MailDomains.Add(mailDomain);

        using(var context = new MyContext){
            context.MailServers.Add(mailServer);
            context.SaveChanges();
        }

アプローチ(B):子のナビゲーションプロパティを親に設定します。

        var mailServer = new MailServer();
        var mailDomain = new MailDomain() {
            DomainName = "foobar.net",
            MailServer = mailServer,
        };

        using(var context = new MyContext){
            context.MailDomains.Add(mailDomain);
            context.SaveChanges();
        }

また、アプローチ(A)では新しいMailDomainインスタンスがコレクションcontext.MailDomainsに自動的に追加され、アプローチ(B)では新しいMailServerインスタンスがコレクションに自動的に追加されると仮定します。 context.MailServers。それは正しいですか、それとも手動で行う必要がありますか?

繰り返しになりますが、私の質問は、2つのアプローチは交換可能ですか?データベースには設定するプロパティ/列が1つ(つまり、MailDomainsの外部キー)しかないのに対し、C#コードには変更できるプロパティが2つ(各クラスに1つ)あるので混乱します。

13
Joerg

はい、2つのアプローチは交換可能です。これにより、MailServerまたはMailDomainのいずれかの観点から、オブジェクトグラフを作成してデータベースに保存できます。

コードファーストを行う場合、プロパティとマッピングが不要な場合はそれらを削除するオプションがあります。

また、アプローチ(A)では新しいMailDomainインスタンスがcontext.MailDomainsに自動的に追加され、アプローチ(B)では新しいMailServerインスタンスがcontext.MailServersに自動的に追加されると想定しています。それは正しいですか、それとも手動で行う必要がありますか?

「コンテキストに追加」の意味によって異なります。つまり、永続化すると自動的にデータベースに保存されますか?答えは「はい」です。 EFのようなORMを使用することの大きな利点の1つは、完全なオブジェクトグラフの自動保存(およびPK/FK関係の同期など)を処理することです。

つまり、保存する前にコンテキストを介してエンティティを利用できるようになるのでしょうか、そうは思いません(100%確信はありません)。

6
Phil Sandler