为什么这个构造函数代码被命中?

时间:2013-06-16 04:23:21

标签: c# .net

我有一个在构造函数中有一些定义的类:

public class Card
{
    public Card()
    {
        DateCreated = DateTime.Now;
    }
    public virtual DateTime DateCreated { get; set; }

}

如果我打电话给以下人员:

_repository.GetCard(cardId);

_repository包含这个:

public Card GetCard(int cardId)
    {
        var card = _db.Cards.FirstOrDefault(s => s.CardId == cardId);  // happens immediately after this is hit
        if (card != null) return card;
        return null;
    }

构造函数代码被命中(我设置了一个断点)。为什么是这样?我是C#的新手 - 我期待构造函数只有在通过类似var newCard = new Card();之类的东西创建对象时才会被击中。

这给我带来了问题,因为有了一些对象,我在构造函数中创建了新对象(比如记录实体创建的历史条目) - 现在有太多的对象被创建,因为构造函数代码受到了影响所以经常。

_db code:

public class AppDbContext : DbContext, IAppDbContext
{

    public AppDbContext() : base("name=TestConnection")
    {

    }

    public AppDbContext(string connectionString) : base(connectionString)
    {

    }

    public DbSet<Card> Cards { get; set; }

    void IAppDbContext.Save()
    {
        SaveChanges();
    }

    IQueryable<Card> IAppDbContext.Cards
    {
        get { return Cards; }
    }


 }

1 个答案:

答案 0 :(得分:4)

您正在使用EntityFramework从数据库中检索项目。检索它们时,EF必须创建类的实例以将数据返回给您。当它创建实例时,它显然会触发你的构造函数。怎么还能把你班级的实例归还给你呢?所以在EF内部深处它会调用var entity = new TEntity();,其中TEntity是你的Card类。

这也是EF要求你的模型对象拥有无参数构造函数的原因。