Я сначала пытаюсь создать код 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();
}
}