TLDR:为什么Entity Framework会在数据源的末尾附加额外的路径?为了使用这个框架,我需要做什么?还有另一种方法可以解决这个问题吗?
我正在编写一个基本的SQL Server CE winforms程序来存储一些数据。我最初有1个上下文用于与1个类进行交互。现在,我希望添加另一个类,因此我重构了一个可以从中派生原始上下文的基本上下文。我有代码在运行,虽然我不能用它创建任何数据库。
我从用户到数据库的路径,并设置| DataDirectory |,我用它作为数据源。
<add name="MonsterContext"
connectionString="Data Source=|DataDirectory|; Persist Security Info=False"
providerName="System.Data.SqlServerCe.4.0" />
我打算让数据源看起来像
C:Path\To\DatabaseFile.sdf
但是它出现了
C:\Path\To\DatabaseFile.sdf\Namespace.BaseContext`1[Namespace.ModelClass].sdf ]"}
我认为这条路径表明它正在构建基于EF默认值的源代码。
我的基本背景是:
public class EntityContext<T> : DbContext where T : class
{
public string TableName { get; set; }
public EntityContext()
: base("name=MonsterContext")
{
}
public EntityContext(string tableName)
{
this.TableName = tableName;
}
public DbSet<T> Entities { get; set; }
}
我的衍生语境是:
public class MonsterReader : Reader<Monster>
{
private List<Monster> monsters;
public List<Monster> Monsters
{
get
{
if (monsters == null)
{
monsters = ReadAll();
}
return monsters;
}
private set { monsters = value; }
}
public MonsterReader(string file)
: base(file)
{ }
public MonsterReader(Stream reader)
: base(reader)
{ }
public void CreateMonsterDatabase(IEnumerable<Monster> monsters)
{
CreateDatabase(monsters, TableName);
}
private string TableName { get; set; }
}
答案 0 :(得分:0)
在这个问题中,这是基础上下文中的一个简单遗漏。
在基本实体上下文中,第一个构造函数是:
public EntityContext()
: base("name=MonsterContext")
{
}
但是,采用表名的构造函数是
public EntityContext(string tableName)
{
this.TableName = tableName;
}
缺少: base("name=MonsterContext")
如果要从app.config调用特定的连接字符串,则必须进行此调用。 在这种情况下,您要调用的连接字符串是“Monster Context”。在不指定哪个上下文的情况下,实体框架默认使用SQL Server CE
|DataDirectory|\Namespace.NameofContext.sdf