查看多个表

时间:2014-10-17 13:41:31

标签: c# asp.net-mvc-5 viewmodel

我的数据库中有两个表有相似但不相同的表。

我想在同一视图中显示这些表格。在互联网上查看最常用的做法是使用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表...

我做错了什么?

谢谢

1 个答案:

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