C# 将多对一表关系映射到视图
我正在尝试映射多对一关系。我觉得我很接近,但不是很接近 我有这个传感器表:C# 将多对一表关系映射到视图,c#,sql,asp.net,asp.net-mvc,razor,C#,Sql,Asp.net,Asp.net Mvc,Razor,我正在尝试映射多对一关系。我觉得我很接近,但不是很接近 我有这个传感器表: 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
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; }
}
事实上应该是相反的,至少在我看来是这样。传感器将保存一个列表
,但传感器中没有链接该列表的FK。数据
记录仅通过传感器的FK映射到传感器
我现在面临的问题是,我现在的观点是:
@model IEnumerable<DataVisualization.Models.Data>
我的观点要求:
@model IEnumerable<DataVisualization.Models.DataViewModel>
但是,这会在数据库表中创建一列
DataSensor\u Id
。这显然是不可取的,因为这将是一对一。我将在下面留下我的另一个答案,因为它仍然提供有价值的信息
这就是如何从数据库中提取数据进行显示的方法。您使用的是数据库优先的方法。我建议创建一个新项目来测试这一点,并习惯正在发生的事情。现在,您需要转到功能区中的“工具”并选择“连接到数据库”。输入相关信息以连接到数据库。现在创建一个新项目,如果您还没有。为了便于学习,请创建一个没有身份验证的Asp.Net5 web应用程序。现在,转到NuGet包管理器控制台。运行“安装包EntityFramework.MicrosoftSqlServer-Pre”。完成后,运行“安装包EntityFramework.Commands–Pre”和“安装包EntityFramework.MicrosoftSqlServer.Design–Pre”。一旦这些都安装好了,转到Project.Json文件,在commands部分添加“ef”:“EntityFramework.commands”。现在,转到命令提示符并cd到您的项目目录。我发现最简单的方法是右键单击项目并在文件资源管理器中打开文件夹。一旦你这样做了,就上一层,这样你所看到的就是一个文件夹。如果您看到项目的所有内容,那么这不是正确的位置。按住Shift键并右键单击文件夹,您应该可以在此处看到打开命令窗口的选项。单击该按钮,然后在项目目录中打开命令提示符。跑
dnvm使用1.0.0-rc1-update1
或者我发现,在某些情况下,这是行不通的。如果这不起作用,那么运行
dnvm使用1.0.0-rc1-final
如果这两项都不起作用,则需要安装1.0.0-rc1。一旦这些工作之一,运行
dnx ef dbcontext脚手架
“Server=enteryourconnectionstringher;Database=YourDataBaseNameHere;Trusted\u Connection=True;”
EntityFramework.MicrosoftSqlServer--outputDir模型
完成后,您应该在models目录中拥有从数据库创建的模型。转到Models目录中新创建的上下文类。在那里,您将看到一个override void onConfigurang方法。删除那个。打开Startup.cs并将这些using语句放在顶部
使用project.Models
使用Microsoft.Data.Entity
现在,在Startup.cs中的ConfigureServices方法中添加
var connection =@"Server=YourConnectionString;Database=YourDatabaseName;Trusted_Connection=True;";
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<YourContextName>(options => options.UseSqlServer(connection));
第一个重载是部分视图的名称,第二个重载是要传递给该视图的模型数据。谢谢,但我认为不需要API。我只是想建立一种非常普通的关系。就像一个用户可以做很多事务一样,这些事务被映射到数据库中的用户。如果你已经有了一个数据库,我想你可能走错了方向。如果您所要做的只是从数据库中提取并显示值,那么有一种更简单的方法可以做到这一点。让我知道你是否正在尝试这样做,我将相应地更改我的答案。是的,我只想从一个位置提取我的所有传感器,并获取属于该传感器的所有数据。数据和所有传感器信息/详细信息存储在数据库中。希望答案上的新内容对您有所帮助。我在下面留下了旧的答案,但你不必担心。
@model IEnumerable<DataVisualization.Models.DataViewModel>
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; }
}
var connection =@"Server=YourConnectionString;Database=YourDatabaseName;Trusted_Connection=True;";
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<YourContextName>(options => options.UseSqlServer(connection));
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; }
}
@model IEnumerable<DataVisualization.Models.GatheredData>
@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)