2

所以我有一个模型:

[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;
4

2 回答 2

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;
        }
    }
}
于 2013-04-10T16:09:50.917 回答
1

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

它需要是“导航属性”,这意味着您需要在站点和船舶之间建立明确的(外键)关系

然后你会有这样的东西

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);
}
于 2013-04-10T14:38:17.083 回答