2014-01-07 82 views
1

我在應用程序的某處有以下代碼。代碼是這樣的:動態創建連接字符串EF6.0導致問題

Hyperion.Data.MCQEntities _model = null; 
    const string K_MODEL = @"res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;"; 

    public Engine(string cnnstr) 
    { 
     //string connection =(new ConnectionStringBuilder(cnnstr)).ToString(); 
     string connectionString = new System.Data.EntityClient.EntityConnectionStringBuilder 
     { 
      Metadata = K_MODEL, //"res://*", 
      Provider = "System.Data.SqlClient", 
      ProviderConnectionString = cnnstr, 
     }.ConnectionString; 

     _model = new Data.MCQEntities(connectionString); 
     _model.Connection.Open(); 
    } 

我不明白的問題是,當我使用Metadata = "res://*"它的工作原理,但是當我使用Metadata=K_MODEL不會在所有的工作。可能是什麼問題?

+1

你是否仔細檢查過你的'K_MODEL'值是否正確?我的連接字符串元數據似乎遵循以下模式:'res:// */Entity。{0} .csdl | res:// */Entity。{0} .ssdl | res:// */Entity。{0} .msl' – StriplingWarrior

+0

檢查了很多次。我的工作沒有被卡住,我已經在使用其他可行的表單了。我只是想知道爲什麼它的行爲如此呢?像某些人所建議的那樣,刪除模型並重新創建並不是一個解決方案。資源被嵌入,如果他們不是那麼res:// *永遠不會工作。並且我也確認了型號文件名和loc。幕後發生了什麼? –

+0

我不知道所有這些在幕後工作。如果您在配置文件中使用相同的連接字符串,而不是注入它,它會工作嗎?你可能要仔細檢查一下你的構造函數沒有被改變來做一些黑魔法。 – StriplingWarrior

回答

0

res//*告知EF元數據作爲資源嵌入程序集中。如果您跳過它,EF正在磁盤上查找文件。 edmx的默認構建操作是在程序集中嵌入工件,所以如果您沒有更改此文件不在磁盤上,EF無法找到它們。