4

私はEF4.3を使用しています。初めての企画なので勉強しながら勉強中です。

エンティティに追加のコンストラクターを実装する必要がある場合があります。これを行うために、追加の部分クラスを作成します。これにより、エンティティ User に User2 クラスが関連付けられます。

全体として EF はコンストラクターを作成しないことに気付きましたが、次のようなインスタンスがあります。

public partial class User
{
    public User()
    {
        this.BookmarkedDeals = new HashSet<BookmarkedDeal>();
        this.BookmarkedStores = new HashSet<BookmarkedStore>();
    }

    public System.Guid UserId { get; set; }
    public int UserStatusId { get; set; }
    public int UserRoleId { get; set; }
    public System.DateTime CreatedOn { get; set; }
    public System.DateTime LastVisitedOn { get; set; }

    public virtual ICollection<BookmarkedDeal> BookmarkedDeals { get; set; }
    public virtual ICollection<BookmarkedStore> BookmarkedStores { get; set; }
    public virtual Subscriber Subscriber { get; set; }
}

デザイナーを介してナビゲーション プロパティを追加するのは非常に簡単で、基本コンストラクター内のコードが見落とされたため、これは少し心配になりました。

    public User()
    {
        this.BookmarkedDeals = new HashSet<BookmarkedDeal>();
        this.BookmarkedStores = new HashSet<BookmarkedStore>();
    }

私の質問は、追加のコンストラクターから基本コンストラクターを呼び出す必要がありますか?また、すべての場合にセーフガードとして基本コンストラクターを呼び出すコード (: this User()) を配置する必要がありますか?

4

1 に答える 1

6

EF (データベース ファーストまたはモデル ファースト) は、これらの既定のコンストラクターを作成します...

public User()
{
    this.BookmarkedDeals = new HashSet<BookmarkedDeal>();
    this.BookmarkedStores = new HashSet<BookmarkedStore>();
}

...ナビゲーションコレクションをインスタンス化してsから少し守るためのヘルパーとしてのみNullReferenceException。ただし、必須ではありません。Userを含むDBからエンティティをロードするBookmarkedDealsと、BookmarkedStoresEFはとにかくコレクションをインスタンス化します。自分で作成するUser場合、コンストラクターが存在しない場合は、セットを手動でインスタンス化する必要がありました。

var user = new User { BookmarkedDeals = new HashSet<BookmarkedDeal>() };
user.BookmarkedDeals.Add(new BookmarkedDeal());

新しいコンストラクターを追加する場合は、デフォルトのコンストラクターを呼び出して、すべてのコンストラクター間でコレクションのインスタンス化を一貫させます。しかし、両方のコンストラクターが継承階層ではなく、同じクラスにあるからではthisなく、そうでなければならないと思います。base

public User(SomeType SomeParameter) : this()
{
    //Do somthing with SomeParameter...
}
于 2012-09-16T11:38:19.277 に答える