将基本实体上下文用于代码优先实体框架



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:PathToDatabaseFile.sdf  

但它出来了

C:PathToDatabaseFile.sdfNamespace.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 调用特定的连接字符串,则必须进行此调用。在这种情况下,要调用的连接字符串是"怪物上下文"。在不指定上下文的情况下,实体框架默认使用 SQL Server CE 来

|DataDirectory|Namespace.NameofContext.sdf

最新更新