向实体添加新构造函数

时间:2012-09-16 11:14:29

标签: c# .net entity-framework partial-classes

我正在使用EF4.3。这是我的第一个项目,所以我一直在学习。

有些情况下我需要为实体建立额外的构造函数。我创建了一个额外的分部类来执行此操作,因此实体用户将具有关联的类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())作为安全措施在所有情况下调用我的基础构造函数?

1 个答案:

答案 0 :(得分:6)

EF(Database First或Model First)创建那些默认构造函数......

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

...仅作为实例化导航集合的助手,以防止你对NullReferenceException进行一点点保护。但这不是必需的。如果您从数据库中加载User实体,包括BookmarkedDealsBookmarkedStores EF,无论如何都将实例化集合。如果你自己创建一个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...
}