Как решить проблему «Несколько наборов объектов для одного типа не поддерживаются» с помощью Entity Framework - PullRequest
1 голос
/ 27 мая 2020

Я сначала пытаюсь создать код dbcontext для моей базы данных FHEM.

Эта база данных состоит из двух таблиц current и history с точно такой же схемой. Команды создания 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 не совсем подходит для Entity Концепция рамочной таблицы, но должна быть такой:

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

Чтобы вписаться в схему, я думаю, мне нужно было бы добавить свойство currentId или historyId с типом int.

Но это еще одна проблема.

Как мне объявить класс FhemContext, чтобы удовлетворить ограничения Entity Framework, а также соответствовать исходной схеме базы данных 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();
    }
}

1 Ответ

3 голосов
/ 27 мая 2020

Может ли это помочь?

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
{
}

И сопоставить тип History с историей таблицы и так далее.

...