为什么我必须有 Code First 的无参数构造函数/Entity Framework
Why must I have a parameterless constructor for Code First / Entity Framework
这更像是 "Why we do things" 的问题,因为我的实际问题已解决,但我不知道为什么。
我在 CountyRepository 中处理以下代码:
public IEnumerable<County> GetCounties(string stateAbbr)
{
using (var db = new AppDbContext())
{
State state = (from s in db.States
where s.Abbr == stateAbbr
select s).First();
return context.Counties.Where(c => c.StateID == state.StateID).ToList();
}
}
我在上面创建的 AppDbContext 将转到自定义初始化程序:
public class AppDbContextInitializer : DropCreateDatabaseIfModelChanges<AppDbContext>
{
protected override void Seed(AppDbContext context)
{
StatesList states = new StatesList();
context.States.AddRange(states);
context.Counties.AddRange(new CountiesList(states));
context.SaveChanges();
}
}
问题是,当我执行代码时,AppDbContext 会在初始化程序中正确加载州和县信息,但是当它返回到县存储库时,AppDbContext 是空的,并且由于 "State has no parameterless constructor".我不希望我的 State 对象有一个无参数的构造函数,所以我整天都在寻找 AppDbContext 为什么会加载到 County Repository 中的解决方案。我终于找到了以下解决方案:
Exception when loading related objects. Entity Framework
这是一个简单的解决方案。添加无参数构造函数并将其标记为过时。我这样做了,而且效果很好。
我的问题是,为什么我必须这样做?我浏览了多个使用自定义 Initializer 的 CodeFirst 示例,其中 none 提到需要空构造函数或将其标记为过时。
是否有更好的解决方案或至少是解释,以便我可以带着知识而不是困惑继续前进?
必须有一个无参数的构造函数,但它可以是内部的或私有的。 ref question 3
这更像是 "Why we do things" 的问题,因为我的实际问题已解决,但我不知道为什么。
我在 CountyRepository 中处理以下代码:
public IEnumerable<County> GetCounties(string stateAbbr)
{
using (var db = new AppDbContext())
{
State state = (from s in db.States
where s.Abbr == stateAbbr
select s).First();
return context.Counties.Where(c => c.StateID == state.StateID).ToList();
}
}
我在上面创建的 AppDbContext 将转到自定义初始化程序:
public class AppDbContextInitializer : DropCreateDatabaseIfModelChanges<AppDbContext>
{
protected override void Seed(AppDbContext context)
{
StatesList states = new StatesList();
context.States.AddRange(states);
context.Counties.AddRange(new CountiesList(states));
context.SaveChanges();
}
}
问题是,当我执行代码时,AppDbContext 会在初始化程序中正确加载州和县信息,但是当它返回到县存储库时,AppDbContext 是空的,并且由于 "State has no parameterless constructor".我不希望我的 State 对象有一个无参数的构造函数,所以我整天都在寻找 AppDbContext 为什么会加载到 County Repository 中的解决方案。我终于找到了以下解决方案:
Exception when loading related objects. Entity Framework
这是一个简单的解决方案。添加无参数构造函数并将其标记为过时。我这样做了,而且效果很好。
我的问题是,为什么我必须这样做?我浏览了多个使用自定义 Initializer 的 CodeFirst 示例,其中 none 提到需要空构造函数或将其标记为过时。
是否有更好的解决方案或至少是解释,以便我可以带着知识而不是困惑继续前进?
必须有一个无参数的构造函数,但它可以是内部的或私有的。 ref question 3