我正在使用EF 4.1,我创建了一个普通的EF edmx文件。 我是从DB生成的。
当它生成时,我右键单击并选择添加代码生成项,生成新类,然后使用DbContext。我使用模板DbContext生成器。
一切正常。
然后我试着查询上下文:
using (var context = new PasDBEntities())
{
var client=context.ClientCompanies.SingleOrDefault(_=>_.ID==clientCompanyId);
if(client!=null)
创建上下文的新实例没有问题但是当我尝试查询它时会出现问题。我陷入了UnintentionalCodeFirstException。 并得到错误:
{“如果在Code First模式下使用,使用T4模板为Database First和Model First开发生成的代码可能无法正常工作。要继续使用Database First或Model First,请确保在配置文件中指定了Entity Framework连接字符串要使用这些从Database First或Model First生成的类,使用Code First添加任何其他配置,使用属性或DbModelBuilder API,然后删除引发此异常的代码。“}
我不想先使用代码,但我不知道是否可以“关闭”它,或者问题出在哪里。
供参考,这是我的构造函数......
public partial class PasDBEntities : DbContext
{
public PasDBEntities()
: base("PasDBEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
...和连接字符串:
<connectionStrings>
<add name="PasDBEntities"
connectionString="metadata=res://*/PasDB.csdl|
res://*/PasDB.ssdl|
res://*/PasDB.msl;
provider=System.Data.SqlClient;
provider connection string="
data source=localhost;
initial catalog=PasDB;
integrated security=True;
pooling=False;
multipleactiveresultsets=True;
App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
答案 0 :(得分:7)
我看到你正在使用EDMX和模板(.tt)来生成类。但是,如果要从现有数据库获取信息,向导将创建与ObjectContext兼容的ConnectionString(元数据信息和entityframework提供者)。
问题是您使用的连接字符串是ObjectContext(数据库优先和模型优先)。对于DbContext,您应该使用没有元数据信息的connectionstring。
您的连接字符串应为:
<connectionStrings>
<add name="PasDBEntities"
connectionString="data source=localhost;
initial catalog=PasDB;
integrated security=True;
pooling=False;
multipleactiveresultsets=True;
App=EntityFramework"
providerName="System.Data.SqlClient" />