【问题标题】:View with multiple tables多表查看
【发布时间】:2014-10-17 21:56:47
【问题描述】:

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

我想在同一个视图中显示这些表格。在互联网上查看最建议的做法是使用 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 后,我收到错误“找不到密钥”。因此,在 ViewModel 中,我添加了一个带有 [Key] 属性的虚拟变量,现在出现一个错误,提示找不到 iCareAlertViewModel 表...

我做错了什么?

谢谢

【问题讨论】:

  • 为什么类名从小写字母开始,为什么这个字母是“i”?
  • 因为我正在处理的项目被称为,目前,“iCare”和通过 SMS 向我发送警报的 Android 应用程序具有相同的名称。我也调用了我的 Visual Studio 项目 iCare。

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


【解决方案1】:

首先,不要为您的视图模型创建 DbSet,这不是必需的。视图模型是位于数据模型(即实体)和用户界面之间的POCO

您可能需要做的是定义一个接口,该接口具有两个实体共有的属性,如下所示:

public interface IAlert
{
    long AlertID { get; set; }
    long MessageID { get; set; }
    //etc...
}

现在每个实体都可以实现该接口:

public class iCareIndoorAlert : IAlert
{
    //snip
}

现在你的视图模型:

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

【讨论】:

  • 我看不懂代码,真的...告诉我是否正确:IAlert 类具有两个表之间相同的所有属性。在我的例子中,AlertID、MessageID、UUID 和 DateTime。然后我必须创建该类的两个扩展。具有 MAG、MIN 和 Dist 属性的 iCareIndoorAlert.cs 以及具有 Lat、Lon、Acc 属性的 iCareOutdoorAlert.cs。如果从现在开始是对的,那么我在创建 ViewModel 时遗漏了一些东西。为什么又是 AlertID 和 MessageID?
猜你喜欢
  • 2012-08-05
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多