代码之家  ›  专栏  ›  技术社区  ›  Carl Decks

如何对两个表使用相同的模型。或数据库最佳实践

  •  1
  • Carl Decks  · 技术社区  · 6 年前

    在MVC应用程序中,我建立了一个数据库,其中有多个表具有相同的结构,我希望对所有表使用相同的模型,而不必为每个表创建新的模型。当尝试使用同一模型创建多个表时,我得到以下错误:

    “不支持每种类型多个对象集”

    是否可以使用同一个模型创建两个表?

    我用相等的历史价格建立数据库。这个想法是每股本一张表。

     Stock1                       Stock2
     -Date                        -Date
     -Price                       -Price
    

    或者,在数据库设计中的最佳实践是在一个表中拥有所有具有相同结构的数据,然后使用另一个表将数据连接到父表?

    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 回复  |  直到 6 年前
        1
  •  2
  •   Shyju    6 年前

    每只股票一张桌子是个坏主意。

    您可以将所有库存的数据存储在 Stock1 dbContext类的属性。添加属性/列以区分股票名称/股票ID到您的股票表中。

    如果您正在使用 StockI ,创建库存表并 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();