[英]Using Base Entity Context for code first Entity Framework
TLDR:为什么实体框架向我的数据源的末尾追加额外的路径? 为了使用此框架,我需要做什么? 还有另一种方法可以解决这个问题吗?
我正在编写一个基本的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; }
}
在这个问题上,这是从基本上下文中的简单遗漏。
在基础实体上下文中,第一个构造函数是:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.