我的数据库中有两个表有相似但不相同的表。
我想在同一视图中显示这些表格。在互联网上查看最常用的做法是使用ViewModel类。
所以......这些是我的班级表:
iCareIndoorAlert.cs
[Table("iCareIndoorAlerts")]
public class iCareIndoorAlert
{
[Key]
[DisplayName("ID Allarme iCare indoor")]
public long AlertID { get; set; }
[DisplayName("ID Messaggio")]
public long MessageID { get; set; }
public string UUID { get; set; }
public int MAG { get; set; }
public int MIN { get; set; }
[DisplayName("Distanza")]
public float Dist { get; set; }
[DisplayName("Data ora")]
public DateTime DateTime { get; set; }
public virtual HttpPop3 HttpPop3 { get; set; }
}
iCareOutdoorAlert.cs
[Table("iCareOutdoorAlerts")]
public class iCareOutdoorAlert
{
[Key]
[DisplayName("ID Allarme iCare outdoor")]
public long AlertID { get; set; }
[DisplayName("ID Messaggio")]
public long MessageID { get; set; }
[DisplayName("Latitudine")]
public float Lat { get; set; }
[DisplayName("Longitudine")]
public float Lon { get; set; }
[DisplayName("Accuracy")]
public float Acc { get; set; }
[DisplayName("Data ora")]
public DateTime DateTime { get; set; }
}
使用iCareAlertViewModel.cs类创建ViewModel文件夹后:
public List<iCareIndoorAlert> iCareIndoorAlert { get; set; }
public List<iCareOutdoorAlert> iCareOutdoorAlert { get; set; }
并在iCareEntities.cs中添加了行:
public DbSet<iCareIndoorAlert> iCareIndoorAlerts { get; set; }
public DbSet<iCareOutdoorAlert> iCareOutdoorAlerts { get; set; }
public DbSet<iCareAlertViewModel> iCareAlertsViewModels { get; set; }
在我生成iCareAlertController.cs并运行视图Index.cshtml之后,我收到错误“Key not found”。所以在ViewModel中我添加了一个带有[Key]属性的虚拟变量,现在得到一个错误,表示无法找到iCareAlertViewModel表...
我做错了什么?
谢谢
答案 0 :(得分:0)
首先,不要为视图模型创建DbSet,这是不必要的。视图模型是位于数据模型(即您的实体)和用户界面之间的POCO。
您可能需要做的是定义一个具有两个实体共有属性的接口,如下所示:
public interface IAlert
{
long AlertID { get; set; }
long MessageID { get; set; }
//etc...
}
现在每个实体都可以实现该接口:
public class iCareIndoorAlert : IAlert
{
//snip
}
现在你的viewmodel:
public class AlertViewModel : IAlert
{
public long AlertID { get; set; }
public long MessageID { get; set; }
//snip
}
所以你的观点现在会是这样的:
@model IEnumerable<My.Assembly.AlertViewModel>
@foreach(var alert in Model)
{
@Html.DisplayFor(m => m.AlertID)
//etc
}
最后你需要一些东西来将你的实体映射到你的视图模型,你可以使用像Automapper这样的库但是手动,它是这样的(包括动作方法和返回):
public ActionResult Index()
{
List<IAlert> alerts = GetOutdoorAlerts(); //for example
List<AlertViewModel> alertViewModels = alert
.Select(a => new AlertViewModel
{
AlertID = a.AlertID,
MessageID = a.MessageID,
//etc...
});
return View(alertViewModels);
}