我应该知道如何使用外键和DbSet
检索数据,例如:
_context.Orders.Include("Operator");
但如果主模型是List
,我不明白如何做到这一点:
public class LiveData
{
public List<Order> Orders { get; set; }
{
public class Order
{
public int Id { get; set; }
public string Product { get; set; }
public int OperatorId { get; set; }
public virtual Operator Operator { get; set; }
}
运营商定义如下:
public class MyContext : DbContext
{
public IConnectionManager ConnectionManager { get; set; }
public MyContext() : base("MyContext") { }
public DbSet<Operator> Operators { get; set; }
}
public class Operator
{
public int Id { get; set; }
public string Name { get; set; }
}
现在在我的控制器中:
public class MyController : Controller
{
public MyContext _context { get; set; }
public LiveData _liveData { get; set; }
public MyController(MyContext context, LiveData liveData)
{
_context = context;
_liveData = liveData;
}
public ActionResult Index()
{
return View(_liveData.Orders.ToList());
}
}
但未检索Operator
字段(为空)。据我所知,由于延迟加载,因此我应该使用.Include("Operator")
。很遗憾,Include
无法使用List
方法。
解决方法可以手动查询每个Order
记录的相关表格,但我想有更好的方法。
与名称建议一样,LiveData是在运行时创建并填充的RAM变量(非持久性):
public class AutofacContainer
{
public IContainer Container { get; set; }
public AutofacContainer()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterType<MyContext>().PropertiesAutowired();
builder.RegisterType<LiveData>().PropertiesAutowired().InstancePerLifetimeScope();
builder.RegisterType<Erp>().PropertiesAutowired();
Container = builder.Build();
GlobalConfiguration.Configuration.UseAutofacActivator(Container);
DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(Container));
}
}
并在初始化类中:
public class Erp
{
public MyContext _context { get; set; }
public LiveData _liveData { get; set; }
public Erp(MyContext context, LiveData liveData)
{
_context = context;
_liveData = liveData;
// do some I/O operation to retrieve current orders from field (serial communication) and store it in a var Lines
foreach (var line in Lines)
{
Order order = new Order();
// process line and fill fields
_liveData.Orders.Add(order);
}
}
}