在MVC模型中,如何在不同的表中查找字段?

时间:2013-04-10 14:34:02

标签: c# entity-framework

所以我有一个模特:

[Table("Site")]
public class Store : MPropertyAsStringSettable {
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public string Name { get; set; }
    public int CompanyID { get; set; }
    public bool IsActive { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    [Display(Name = "Province")]
    public int ProvinceID { get; set; }
    public string Postal { get; set; }
    public string Phone { get; set; }
    public int StoreNumber { get; set; }
    public bool visible { get; set; }
    public DateTime lastShift { get; set; }
}

字段lastShift来自另一个名为“Shifts”的表,我如何从该表中获取它?

编辑:查找必须是这样的:

  select top 1 shiftDate as lastShift from [Shifts] where SiteID = Store.ID

这是我加载数据的方式:

public class MyDbContext: DbContext {
    public MyDbContext()
        : base("name=DefaultConnection") {
    }
    public DbSet<UserAccount> UserAccounts { get; set; }
    public DbSet<Company> Companies { get; set; }
    public DbSet<Store> Stores { get; set; }
    public DbSet<ProvinceModel> Provinces { get; set; }
}

这就是我使用它的方式:

MyDbContext database = new MyDbContext();
var myStores = from database.Stores select ID;

2 个答案:

答案 0 :(得分:1)

根据您上次编辑编辑,情况并非如此

它需要是一个&#34;导航属性&#34;这意味着您需要在站点和发货之间建立明确的(Foreing Key)关系

然后你会有类似的东西

Store.Shift.LastShift

<击>

但是如果它是一对多的关系(并且LastShift字段不是Shift表的一部分)那么

您需要手动执行此操作,并使用视图模型或自定义属性,它不会直接映射到表格并在代码中的某处进行分配

如果你正在使用存储库,那么你需要在那里添加一个方法来获得最后一次移位

然后(或者如果你直接使用ORM)你使用@Cristi发布的代码,只记得添加排序

public ActionResult MyAction(){
var store = db.Stores.Where(x => x.ID == objId).Select(x => new StoreModel(){
    Name = x.Name,
    ID = x.ID,
    lastShift = db.Shifts.FirstOrDefault(y => y.SiteID == x.ID).OrderByDescending(shift => shift.Date);
}).FirstOrDefault();

return View(store);
}

答案 1 :(得分:1)

以下是我解决问题的方法。

TL,DR:我在我的控制器中共享了我的dbcontext,所以我可以在我的模型中访问它!


我使用以下代码手动加载我的商店模型中的lastShiftTime:

public class Store : MPropertyAsStringSettable {
    .......
    public DateTime lastShiftTime { 
        get{
            MyDbContext curContext = MyWebProject.Controllers.MyBaseController.database;
            if (curContext != null) {
                return (from shift in curContext.Shifts where shift.SiteID == ID select shift.ShiftDate).First();
            } else {
                return new DateTime(0);
            }
        }
    }
}

这是我为此创建的Shift模型,非常标准:

[Table("Shifts")]
public class Shift : MPropertyAsStringSettable {
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public int SiteID { get; set; }
    public string ShiftID_In_POS { get; set; }
    public DateTime ShiftDate { get; set; }
}

以下是我在控制器中共享上下文的方式:

public class MyBaseController : Controller {
    .........
    private static MyDbContext _database;
    public static MyDbContext database {
        get {
            if (_database == null) {
                _database = new MyDbContext();
            }
            return _database;
        }
    }
}