使用基本实体上下文代码第一个实体框架

时间:2014-02-07 20:47:02

标签: c# winforms entity-framework

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; }
}

1 个答案:

答案 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