如何用 Entity Framework 解决 "Multiple object sets per type are not supported" 问题
How to solve the "Multiple object sets per type are not supported" problem with Entity Framework
我正在尝试先为我的 FHEM 数据库构建代码 dbcontext
。
这个数据库由两个 table 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
class不太符合Entity Frameworktable的概念,但应该是这样的:
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.
但这是另一个问题。
我必须如何声明 class FhemContext
才能满足 Entity Framework 限制并符合 FHEM 的原始数据库模式?
- 也许我应该添加一个标记列来定义该行是当前行还是历史行?但是这两个 table 背后的想法似乎是访问当前 table 总是比访问历史要快,因为行数。
问候沃尔夫冈
这是我现在可以使用的代码:
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();
}
}
这会有帮助吗?
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 映射到 table 历史等等。
我正在尝试先为我的 FHEM 数据库构建代码 dbcontext
。
这个数据库由两个 table 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
class不太符合Entity Frameworktable的概念,但应该是这样的:
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.
但这是另一个问题。
我必须如何声明 class FhemContext
才能满足 Entity Framework 限制并符合 FHEM 的原始数据库模式?
- 也许我应该添加一个标记列来定义该行是当前行还是历史行?但是这两个 table 背后的想法似乎是访问当前 table 总是比访问历史要快,因为行数。
问候沃尔夫冈
这是我现在可以使用的代码:
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();
}
}
这会有帮助吗?
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 映射到 table 历史等等。