使用带有DbContext和Lists的外键

时间:2017-12-12 20:39:39

标签: c# entity-framework asp.net-mvc-5

我应该知道如何使用外键和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);
        }            
    }
}

0 个答案:

没有答案