2016-04-15 15 views
0

多対1の関係をマップしようとしています。私は私が近くにいるが、かなりそこにいると感じる。 Data表には多くのデータレコードを保持している表示するテーブル関係を多対1にマッピング

SensorId 
FK_LocationId 
Name 
etc... 

私はこのセンサーテーブルを持っています。

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がない場合。 A Dataレコードは、そのセンサーのFKによってセンサーにマップされます。

私はここに直面してる問題は、私は今、私の見解では、このラインを持っているだろうということです。

@model IEnumerable<DataVisualization.Models.Data> 

、代わりの情報を表示し、データを表示するために私のセンサーをループ(最終的にはチャート)。私はすべてのデータをループしなければならず、どうにかしてそれをどのように整理してからそれを表示する必要があります。

@model IEnumerable<DataVisualization.Models.DataSensor> 

をしかし、それはその私の知る限りのいずれかを公開しないDataDataSensorであるので、これは私に、データへのアクセス権を与えるものではありません。だから私はまだ必要があります。

@model IEnumerable<DataVisualization.Models.DataViewModel> 

これはエレガントな方法に見えたが、私はそれを動作させることができませんでした:

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

そして、私のビューが必要になります。だから私は、それらを一緒にマッピングしたクラスのsomekindについて考えました。これはDbContextpublic DbSet<DataViewModel> dataViewModel { get; set; }が必要で、それがデータベースに厄介なテーブルを生成するためです。

モデルを作成する方法についてのヘルプは、コントローラでそれを操作し、ビューに表示すると大変感謝します。

編集

このモデルについて、私はこれに接続されたデータへのアクセス権を持っていますか?

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を作成します。これは明らかに望ましくないことです。それは1対1になるからです。

答えて

0

貴重な情報がまだ残っているので、私は以下の回答を残しておきます。

これは、データベースからデータを引き出して表示する方法です。あなたはデータベースの最初のアプローチを使用しています。私はこれをテストし、何が起こっているのかに慣れるために新しいプロジェクトを作成することをお勧めします。今度はリボンのツールに行き、データベースへの接続を選択したいと思っています。関連情報を入力してデータベースに接続します。まだ新しいプロジェクトを作成します。学習する目的で、認証なしでAsp.Net5 Webアプリケーションを作成します。さて、あなたのNuGet Package Manager Consoleに行きましょう。 「Install-Package EntityFramework.MicrosoftSqlServer -Pre」を実行します。完了したら "Install-Package EntityFramework.Commands -Pre"と "Install-Package EntityFramework.MicrosoftSqlServer.Design -Pre"を実行します。それらがインストールされたら、Project.Jsonファイルに移動し、コマンドセクションに "ef": "EntityFramework.Commands"を追加します。今度は、コマンドプロンプトに行き、プロジェクトディレクトリにcdしてください。私がこれを行うために見つけた最も簡単な方法は、あなたのプロジェクトを右クリックし、ファイルエクスプローラでフォルダを開くことです。一度それを行うと、1つのレベルに上がるので、すべてが1つのフォルダです。プロジェクトのすべての内容が表示されたら、それは適切な場所ではありません。 Shift +右クリックしてフォルダを開くと、ここにコマンドウィンドウを開くオプションが表示されます。それをクリックし、コマンドプロンプトがプロジェクトディレクトリに開かれたら、

dnvmの使用1.0.0-RC1-アップデート1

またはいくつかのケースでは動作しないことを私が発見した実行します。それでも解決しない場合は、これらのいずれもが、あなたが1.0.0-RC1をインストールする必要が作業している場合は、その後

dnvmの使用1.0.0-RC1-最終

を実行します。これらの作品の一つ、ファイル名を指定して実行

一度DNX EF dbcontext 足場 "サーバー= EnterYourConnectionStringHereを;データベース= YourDataBaseNameHere; Trusted_Connection =真;" EntityFramework.MicrosoftSqlServer --outputDirモデル

それはあなたがモデルのディレクトリにデータベースから作成されたモデルを持っている必要があります完了したら。 Models Directoryの新しく作成されたコンテキストクラスに移動します。そこに入ると、オーバーライドvoid OnConfiguringメソッドが表示されます。それを削除します。あなたのStartup.csを開き、これらの文を一番上に置きます。 YourProject.Modelsを使用して;

;

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


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

    } 

のようなデータ注釈によって慣例により、これを行うことができ

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> 


} 

次に、Datasensorのメインビューに戻り、データを保存する場所を次に示します。

最初のオーバーロードは部分ビューの名前で、2番目のビューはそのビューに渡すモデルデータです。

+0

ありがとうございますが、私はAPIの必要性はないと思います。私は単に非常に共通の関係を作りたいだけです。ユーザーが多くのトランザクションを実行できるように、これらのトランザクションはデータベース内のユーザーにマッピングされます。 – Madmenyo

+0

あなたが既に引っ張っているデータベースを持っているなら、あなたはこれを間違った方向に行っているかもしれないと思います。あなたがしようとしているのは、データベースから取り出して値を表示するだけであれば、これを行うもっと簡単な方法があります。これがあなたがしようとしていることであれば私に教えてください。私はそれに応じて私の答えを変えます。 –

+0

はい、すべてのセンサーを特定の場所から引き出し、そのセンサーに属するすべてのデータを取得したいだけです。データとすべてのセンサ情報/詳細はDBに保存されます。 – Madmenyo

関連する問題