繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM