在MVC应用程序中,我要建立一个具有多个具有相同结构的表的数据库,并且我想对所有表使用相同的模型,而不必为每个表创建新的模型。尝试使用相同的模型创建多个表时,出现以下错误:
“不支持每种类型的多个对象集”
是否可以使用相同的模型创建两个表?
我正在用股票历史价格构建数据库。这个想法是每个权益一张桌子。
Stock1 Stock2
-Date -Date
-Price -Price
还是在db-design中的最佳实践是将所有具有相同结构的数据放在一个表中,然后使用另一个表将数据连接到父表?
Instruments Data
-StockId -Date
-StockName -Price
-StockId(FK)
代码:
//Models for tables
public class Instruments
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
public class Equity
{
[Key]
public int Id { get; set; }
public DateTime Date { get; set; }
[ForeignKey("Instruments")]
public int InstrumentId { get; set; }
public virtual Instruments Instruments { get; set; }
public double Open { get; set; }
public double Close { get; set; }
public double High { get; set; }
public double Low { get; set; }
public int Volume { get; set; }
}
//Code to create tables when running "add-migration"
public DbSet<Instruments> Instruments { get; set; }
public DbSet<Equity> Stock1 { get; set; }
public DbSet<Equity> Stock2 { get; set; }
答案 0 :(得分:2)
每只股票一张桌子是个坏主意。
您可以在DbContext类的Stock1
属性中存储所有股票的数据。在属性表中添加一个属性/列以区分股票名称/ StockId。
如果您使用的是StockI
,请创建一个Stock表,并且StockId
表中的Equity
将具有一个到Stock表的外键连接。
public class Stock
{
public int Id { get; set; }
public string Ticker { set;get; }
public string Name { get; set; }
}
public class Equity
{
[Key]
public int Id { get; set; }
public DateTime Date { get; set; }
[ForeignKey("Instruments")]
public int InstrumentId { get; set; }
public virtual Instruments Instruments { get; set; }
public double Open { get; set; }
public double Close { get; set; }
public double High { get; set; }
public double Low { get; set; }
public int Volume { get; set; }
public int StockId { set;get;}
public virtual Stock Stock { set;get;}
}
现在在您的DbContext类中,您将只有一个DbSet<Equity>
类型的属性。您可以通过此访问所有股票记录,也可以根据需要对其进行过滤(例如:获取特定股票的记录)
public DbSet<Equity> Equities { get; set; }
要获取特定库存的数据,通常将使用过滤器。例如,
var stockIdOfMsft = 24;
var msftEquities = db.Equities.Where(a=>a.StockId == stockIdOfMsft).ToList();
或
var msftEquities = db.Equities.Where(a=>a.Stock.Ticker == "MSFT").ToList();