2016-04-15 85 views
0

我想映射一個多對一的關係。我覺得我很接近但並不那麼完美。映射許多到一個表關係來查看

我有這樣的傳感器表:

SensorId 
FK_LocationId 
Name 
etc... 

保持在Data表許多數據記錄。

DataId 
FK_SensorId 
Time 
Value 

而我正在嘗試爲此創建一個模型。

public class DataSensor 
{ 
    public int Id { get; set; } 
    public int DataNodeId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public bool active; 
    public bool alarm; 
} 

public class GatheredData 
{ 
    public int Id { get; set; } 
    public int DataSensorId { get; set; } 
    public DateTime Time { get; set; } 
    public float value { get; set; } 

    [ForeignKey("DataSensorId")] 
    public virtual DataSensor datasensor { get; set; } 
} 

它實際上應該是相反的方式,至少在我的腦海裏。傳感器將持有List<Data>但傳感器中沒有FK鏈接。記錄僅通過該傳感器的FK映射到傳感器。

我這裏面臨的問題是,我必須現在這條線在我看來:

@model IEnumerable<DataVisualization.Models.Data> 

而不是循環在我的傳感器顯示的信息,然後顯示數據(最終圖表)。我必須循環所有數據,以某種方式組織它,然後顯示它。所以,我仍然需要:

@model IEnumerable<DataVisualization.Models.DataSensor> 

但是,這並不讓我對數據的訪問,因爲這是在DataDataSensor不公開任何AFAIK的。於是我想到了類somekind的映射在一起:

public class DataViewModel 
{ 
    public DataSensor dataSensor { get; set; } 
    public List<GatheredData> gatheredData { get; set; } 
} 

而且我認爲將需要:

@model IEnumerable<DataVisualization.Models.DataViewModel> 

這似乎一種優雅的方式,但我不能使它發揮作用。可能因爲這需要public DbSet<DataViewModel> dataViewModel { get; set; }DbContext這將在我的數據庫中產生一個尷尬的表。

因此,如何創建模型的任何幫助,在控制器中使用它並在視圖中顯示它將不勝感激。

編輯

這個怎麼樣模式,使我有機會獲得連接到這個數據?

public class DataSensor 
{ 
    [Key] 
    public int Id { get; set; } 
    public int DataNodeId { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public bool active; 
    public bool alarm; 

    public virtual ICollection<DataSensor> Data { get; set; } 
} 

但是,這會在數據庫表中創建一個列DataSensor_Id。這顯然是不可取的,因爲那將是一對一的。

回答

0

我打算在下面留下我的其他答案,因爲它仍然提供有價值的信息。

這就是你如何完成從數據庫中提取數據以便顯示。您正在使用數據庫第一種方法。我會建議創建一個新的項目來測試這個並習慣正在發生的事情。現在您將要使用功能區中的工具並選擇連接到數據庫。輸入相關信息以連接到數據庫。現在創建新的項目,如果你還沒有。爲了學習目的,創建一個沒有身份驗證的Asp.Net5 Web應用程序。現在,轉到您的NuGet程序包管理器控制檯。運行「Install-Package EntityFramework.MicrosoftSqlServer -Pre」。一旦完成運行「Install-Package EntityFramework.Commands -Pre」和「Install-Package EntityFramework.MicrosoftSqlServer.Design -Pre」。安裝完成後,轉到Project.Json文件並在命令部分添加「ef」:「EntityFramework.Commands」。現在,轉到命令提示符並cd到您的項目目錄。我發現最簡單的方法是右鍵單擊您的項目並在文件資源管理器中打開文件夾。一旦你這樣做,上一層,所以你看到的只是一個文件夾。如果你看到你的項目的所有內容,那麼這不是正確的地方。 Shift +右鍵單擊該文件夾,您應該看到在此處打開命令窗口的選項。單擊它並在您的項目目錄中打開一個命令提示符。運行

dnvm使用1.0.0-RC1-UPDATE1

或我發現,不是在某些情況下工作。如果不工作,然後運行

dnvm使用1.0.0-RC1決賽

如果沒有這些工作,你需要安裝1.0.0-RC1。一旦這些工作之一,運行

DNX EF的DbContext支架 「服務器= EnterYourConnectionStringHere;數據庫= YourDataBaseNameHere; Trusted_Connection = TRUE;」 EntityFramework.MicrosoftSqlServer --outputDir模型

一旦完成,你應該從車型目錄數據庫中創建您的模型。轉到模型目錄中新創建的上下文類。一旦在那裏,你會看到一個覆蓋無效的OnConfiguring方法。刪除那個。打開你的Startup.cs並將這些使用語句放在頂部。

using YourProject.Models;

using Microsoft.Data.Entity;

現在在Startup.cs您ConfigureServices方法添加

var connection [email protected]"Server=YourConnectionString;Database=YourDatabaseName;Trusted_Connection=True;"; 

      services.AddEntityFramework() 
       .AddSqlServer() 
       .AddDbContext<YourContextName>(options => options.UseSqlServer(connection)); 

然後剩下的只是爲您創造新註冊的情況下的控制器和視圖。

老回答以下

嘗試使用流利的API來指定的關係。像這樣:(提示:這是在你的ApplicationDbContext中。)

protected override void OnModelCreating(ModelBuilder builder) 
     { 
      base.OnModelCreating(builder); 

      builder.Entity<DataSensor>() 
       .HasMany(p => p.Data) 
       .WithOne(); 
     } 
     public DbSet<DataSensor> DataSensor { get; set; } 
     public DbSet<GatheredData> GatheredData { get; set; } 

而且你的類是這樣的:

public class DataSensor 
    { 
     public int Id { get; set; } 
     public int DataNodeId { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public bool active; 
     public bool alarm; 
     public virtual ICollection<DataSensor> Data { get; set; } 

    } 

    public class GatheredData 
    { 
     public int Id { get; set; } 
     public int DataSensorId { get; set; } 
     public DateTime Time { get; set; } 
     public float value { get; set; } 

     [ForeignKey("DataSensorId")] 
     public virtual DataSensor datasensor { get; set; } 

    } 

你也可以做到這一點按照慣例這樣

public class DataSensor 
    { 
     public int Id { get; set; } 
     public int DataNodeId { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public bool active; 
     public bool alarm; 
     public virtual ICollection<DataSensor> Data { get; set; } 

    } 

    public class GatheredData 
    { 
     public int Id { get; set; } 
     public int DataSensorId { get; set; } 
     public DateTime Time { get; set; } 
     public float value { get; set; } 


     public virtual DataSensor datasensor { get; set; } 

    } 

或數據註解這樣

public class DataSensor 
    { 
     public int Id { get; set; } 
     public int DataNodeId { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public bool active; 
     public bool alarm; 
     public virtual ICollection<DataSensor> Data { get; set; } 

    } 

    public class GatheredData 
    { 
     public int Id { get; set; } 
     public int DataSensorId { get; set; } 
     public DateTime Time { get; set; } 
     public float value { get; set; } 

     [ForeignKey("DataSensorId")] 
     public virtual DataSensor datasensor { get; set; } 

    } 

如果你按照慣例做到這一點它不起作用,數據註釋可以幫助映射它們。如果一切都失敗了,流利的API將覆蓋所有內容並映射關係。

現在,如何顯示這些數據。如果你只是想顯示數據而不編輯它,那麼我認爲創建一個局部視圖將是你最好的選擇。在您的共享文件夾中創建一個空白視圖。將您的模型添加到新視圖。

@model IEnumerable<DataVisualization.Models.GatheredData> 

然後做一個foreach循環遍歷數據。

@foreach (var item in Model) 
{ 
<p>@Html.DisplayFor(modelItem => item.Id)</p> 

<p>@Html.DisplayFor(modelItem => item.Time)</p> 


<p>@Html.DisplayFor(modelItem => item.Value)</p> 


} 

然後回到您的數據傳感器主視圖中,將以下數據放在您想要的位置。

@Html.Partial("StringNameOfThePartialView", Model.Data) 

第一過載是部分視圖的名稱,並且第二個是模型數據被傳遞到該視圖。

+0

謝謝,但我不認爲有需要的API。我只是想創造一個非常普通的關係。就像用戶可以做很多事務一樣,這些事務映射到數據庫中的用戶。 – Madmenyo

+0

如果你已經擁有一個你正在使用的數據庫,我想你可能會以這種錯誤的方式進行。如果你所要做的只是從數據庫中提取數據並顯示值,那麼有一種更簡單的方法可以做到這一點。讓我知道如果這是你想要做的,我會相應地改變我的答案。 –

+0

是的,我想要的只是從一個位置拉出所有傳感器,並獲取屬於該傳感器的所有數據。數據和所有傳感器信息/細節存儲在數據庫中。 – Madmenyo