如何使用实体框架解决“不支持每种类型的多个对象集”问题

问题描述 投票:1回答:1

我正在尝试首先为我的FHEM数据库构建代码dbcontext

此数据库由两个具有完全相同模式的表currenthistory组成。 SQL创建命令如下所示:

CREATE TABLE current 
( 
     TIMESTAMP TIMESTAMP, 
     DEVICE varchar(64), 
     TYPE varchar(64), 
     EVENT varchar(512), 
     READING varchar(64), 
     VALUE varchar(128), 
     UNIT varchar(32)
)

CREATE TABLE history 
( 
     TIMESTAMP TIMESTAMP, 
     DEVICE varchar(64), 
     TYPE varchar(64), 
     EVENT varchar(512), 
     READING varchar(64), 
     VALUE varchar(128), 
     UNIT varchar(32)
)

所以dbcontext应该看起来像这样:

  public class FhemContext : DbContext
  {
        public virtual DbSet<LogEntries> History { get; set; }
        public virtual DbSet<LogEntries> Current{ get; set; }
  }

LogEntries类不太适合实体框架表的概念,但是应该像这样:

public class History
{
    public DateTime Timestamp { get; set; }
    public string DEVICE { get; set; }
    public string TYPE { get; set; }
    public string EVENT { get; set; }
    public string READING { get; set; }
    public string VALUE { get; set; }
    public string UNIT { get; set; }
}

为了适应模式,我认为我必须添加类型为int的属性'currentId'或'historyId'。

但这是另一个问题。

我如何声明类FhemContext以满足实体框架的限制,并且还符合FHEM的原始数据库架构?

  • 也许我应该添加一个标记列,以定义该行是当前行还是历史行?但是,由于行数的原因,这两个表背后的想法似乎是对当前表的访问总是比对历史表的​​访问快。

问候沃尔夫冈

这是现在对我有用的代码:

public class LogEntry
{
    [Key]
    public DateTime Timestamp { get; set; }
    public string DEVICE { get; set; }
    public string TYPE { get; set; }
    public string EVENT { get; set; }
    public string READING { get; set; }
    public string VALUE { get; set; }
    public string UNIT { get; set; }
}

public class Current : LogEntry
{
}

public class History : LogEntry
{
}

public class FhemContext : DbContext
{
    public virtual DbSet<History> History { get; set; }
    public virtual DbSet<Current> Current{ get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var db = new FhemContext();
        Console.WriteLine(db.Current.Count());
        Console.WriteLine(db.History.Count());

        History historyentry = new History { Timestamp = DateTime.Now };
        db.History.Add(historyentry);
        db.SaveChanges();

        Current currentEntry = new Current{ Timestamp = DateTime.Now };
        db.Current.Add(currentEntry);
        db.SaveChanges();
    }
}
c# entity-framework dbcontext
1个回答
3
投票

有什么帮助吗?

public class FhemContext : DbContext
{
    public virtual DbSet<History> History { get; set; }
    public virtual DbSet<Current> Current{ get; set; }
}

public class LogEntry
{
    public DateTime Timestamp { get; set; }
    public string DEVICE { get; set; }
    public string TYPE { get; set; }
    public string EVENT { get; set; }
    public string READING { get; set; }
    public string VALUE { get; set; }
    public string UNIT { get; set; }
}

public class Current : LogEntry
{
}

public class History : LogEntry
{
}

然后将历史记录类型映射到表历史记录,等等。>

© www.soinside.com 2019 - 2024. All rights reserved.