2014-02-07 42 views
0

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

回答

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