如何为两个表使用相同的模型。或db最佳做法

时间:2018-12-28 18:53:41

标签: c# asp.net-mvc ef-code-first

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

1 个答案:

答案 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();