2013-04-10 40 views
2

所以我有一个模型:在MVC模型中,如何查找不同表中的字段?

[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是从一个叫“位移”不同的表,如何从该表得到它?

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

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; 
+0

仅供参考 - 这与MVC无关,这是实体框架。 – jrummell 2013-04-10 15:23:27

+0

这个问题呢?你能看看吗?在此先感谢... http://stackoverflow.com/questions/29333787/how-to-create-lookup-table-and-define-relationships – 2015-03-29 19:38:58

回答

0

这里是我解决了这个问题。

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); 
      } 
     } 
    } 
} 

这里是我的转型模式我为这个创建的,很标准:

[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; 
     } 
    } 
} 
1

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

这将需要一个“导航属性”,这意味着你需要有网站和船舶之间的明确(Foreing键)关系

然后你就会有这样的事情

Store.Shift.LastShift 

但是,如果它是一个一对多的关系(和LastShift场不移位表的一部分),那么

你需要做手工,并使用VI新模型或自定义属性,它不是直接映射到表中,并在代码中的某处执行任务

如果您使用的是存储库,那么您需要在其中添加一个方法以获得最后一次转换

然后(或者,如果您是直接使用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); 
} 
+0

你能提供一个自定义属性的例子吗? – Bill 2013-04-10 14:43:08

+0

这和你已经有'public DateTime lastShift {get;组; }'但你需要手动完成分配。 MVC没有办法知道'LastShift'意思是'选择顶部1 shiftDate作为lastShift从[Shifts] Where SiteID = Store.ID' – pollirrata 2013-04-10 14:45:02

+0

你能否提供一些代码来说明我将如何在linq中运行这个查询或SQL来获得该字段? – Bill 2013-04-10 14:47:22

相关问题