我有一个在构造函数中有一些定义的类:
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; }
}
}
答案 0 :(得分:4)
您正在使用EntityFramework从数据库中检索项目。检索它们时,EF必须创建类的实例以将数据返回给您。当它创建实例时,它显然会触发你的构造函数。怎么还能把你班级的实例归还给你呢?所以在EF内部深处它会调用var entity = new TEntity();
,其中TEntity是你的Card类。
这也是EF要求你的模型对象拥有无参数构造函数的原因。