2014-10-17 53 views
0

我在我的數據庫中有兩個表格有類似的數據但不相同。查看多個表格

我想在相同的視圖中顯示這些表。在互聯網上最常見的做法是使用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類:

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表...

我在做什麼錯?

謝謝

+0

爲什麼你從小寫字母開始類名,爲什麼這是字母是「我」? – 2014-10-17 13:44:15

+0

由於我正在致力於此項目,因此目前「iCare」和Android應用程序通過SMS向我發送警報具有相同的名稱。我也打電話給我的Visual Studio項目iCare。 – 2014-10-17 13:47:43

回答

0

首先,不要爲你的視圖模型創建一個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   
} 

那麼您認爲現在是someth荷蘭國際集團這樣的:

@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); 
} 
+0

我無法理解代碼,真的......告訴我它是否正確:IAlert類具有兩個表之間相同的所有屬性。在我的情況AlertID,MessageID,UUID和DateTime。然後我必須創建該類的兩個擴展。 iCareIndoorAlert.cs,具有屬性Lat,Lon,Acc的屬性MAG,MIN和Dist以及iCareOutdoorAlert.cs。如果從現在開始它是正確的,我在ViewModel創建中缺少一些東西。爲什麼又一次AlertID和MessageID? – 2014-10-24 15:44:00