我在.NET framework 4.5(VS 2012)中有一个WPF项目,并使用NuGet包下载了Entity Framework 5.解决方案.所有关于Entity Framework 5的文档都说默认代码生成策略是None(即DbContext代码生成).但就我而言,在添加新的ADO.Net实体数据模型时,代码生成策略是默认的(即EF设计器生成派生自ObjectContext的上下文类和从EntityObject派生的实体类.)但我想遵循DbConext代码生成机制.我正在遵循Database First方法.我错过了任何设置吗?还是我需要单独安装T4模板?
谢谢.
我正在学习实体框架(5.0和VSExpress 2012),我在将查询绑定到WinForms中的dataGridView时遇到了麻烦.我有下面的代码,当我启动应用程序时它显示我的查询,但我不知道在更改底层数据库中的数据后我需要做什么来更新dataGridView.这样做的最佳方法是什么?我在这做错了什么?
private void Form1_Load(object sender, EventArgs e)
{
using( var ctx = new TimeKeepEntities())
{
var qLoggedIn = from r in ctx.tblTimeRecords
where (r.tblEmployee.Active && !r.ClockOut.HasValue) || System.Data.Objects.EntityFunctions.DiffDays(r.ClockOut, DateTime.Now)<30
select new { Name = r.tblEmployee.Last + ", " + r.tblEmployee.First, r.tblProject.ProjName, r.ClockIn, r.ClockOut };
dataGridView1.DataSource = qLoggedIn.ToList();
}
}
Run Code Online (Sandbox Code Playgroud) 由于EF的更改跟踪和延迟加载功能,我在查询中遇到问题.问题是,在我得到查询结果之后,我使用AutoMapper将域对象映射到我的业务模型中,但由于已经处理了上下文,它不断抛出异常.
ObjectContext实例已被释放,不能再用于需要连接的操作.
当我在调试器中查看结果集合时,我看到它是一个列表,DynamicProxy而不是实际的实体.我试图停止更改跟踪,但这没有帮助.这是我的代码:
public List<ContentTypeColumn> GetContentTypeColumns(Int64 contentTypeId)
{
List<ContentTypeColumn> result = new List<ContentTypeColumn>();
using (SCGREDbContext context = new SCGREDbContext())
{
ContentType contentType = context.ContentTypes.Include("Parent").AsNoTracking().FirstOrDefault(x => x.Id.Equals(contentTypeId));
result.AddRange(contentType.ContentTypeColumns.ToList());
while (contentType.Parent != null)
{
result.AddRange(contentType.Parent.ContentTypeColumns.ToList());
contentType = contentType.Parent;
}
}
return result.ToList();
}
Run Code Online (Sandbox Code Playgroud)
注意:如果您需要查看此操作中涉及的域模型,可以参考此问题.
entity-framework lazy-loading change-tracking objectcontext entity-framework-5
我正在使用VS 2010中的Entity Framewok 4.0 POCO和WCF服务开发Dot Net项目.由于性能改进和表值功能支持,我将切换到Ef 5.0和VS 2012.
但我搜索了很多,没有找到任何poco生成器模板或DBcontext生成器模板,支持在VS 2012和EF5.x中使用DataContract和DataMember属性.
[DataContract(IsReference = true)]
[KnownType(typeof(Transactions))]
public partial class Accounts
{
[DataMember]
public int AccountID { get; set; }
[DataMember]
public string AccountCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
1-有没有人有这样的模板在VS2012中工作?
2-有没有人知道EF 5.x DBContext生成器中所需的更改,以自定义模板以支持WCF所需的属性.
我的时间很少,我真的需要帮助.
感谢您的帮助或指导.
我们一直在密切关注使用Breezejs的SPA,以便在客户端和服务器之间提供数据上下文.这些功能在客户端看起来很棒,但是我们希望在服务器上使用Repository模式,并且可以很好地分离关注点,而不必继承EFContextProvider,这会导致IoC出现问题,并可能导致单元测试/模拟.我们一直在关注Plupaight上John Papa的Code Camper样本,该样本最初使用没有Breeze的Respository/UoW模式,然后让我们看看包含Breeze的Hot Towel模板.
有谁知道Breeze如何被抽象到一个Repository,它可以干净地保存DbContext(如果使用Entity Framework).此外,如果您不使用Entity Framework并且更喜欢使用其他ORM(如nHibernate),会发生什么.
repository-pattern entity-framework-5 single-page-application breeze
我重新安装了VS2012和Update 2.我创建了一个新的"ASP.NET动态数据实体Web应用程序"项目.然后我添加了一个"ADO.NET实体数据模型",它是从现有的SQLServerExpress数据库生成的.
但是,当我去构建解决方案时,我收到以下错误:
找不到类型或命名空间名称'IObjectContextAdapter'(您是否缺少using指令或程序集引用?)
这似乎是在声明,System.Data.Entity.Infrastructure但我无法在任何地方找到那个集会.我已经验证我已经为解决方案安装了EF5,因为我的packages.config显示:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="EntityFramework" version="5.0.0" targetFramework="net45" />
</packages>
Run Code Online (Sandbox Code Playgroud)
EntityFramework引用属性显示:
RuntimeVersion:v4.0.30319
版本:5.0.0.0
在web.config我有:
<assemblies>
<add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</assemblies>
Run Code Online (Sandbox Code Playgroud)
这看起来不对,因为应该说5.0.0.0?然而,改变它没有任何影响.有人可以指点我正确的方向吗?
我看到许多使用Code First播种的例子,但我不确定我在使用EF Database First时了解播种数据库的惯用方法.
我正在使用asp.net mvc 3和实体框架5.我有我的.edmx文件并且能够使用linq或SP与我的数据库交互,但我想运行一些原始的sql语句.我正在尝试这样的事情:
Using(var ctx=new HREntities())
{
ctx.Database.ExecuteSqlCommand("insert into Employees values {0}, {1}", model.EMPLOYEEID, model.EMPLOYEENAME);
ctx.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
是否有可能以这种方式执行sql查询?谢谢.
实体A,B的关系是一对多,(A有很多B,B必须属于A).
我禁用lazy loading并加载A,B,如下所示:
dbContext.As.Load();
//**particaly load B**
dbContext.Bs.Where(predicateX).Load();
Run Code Online (Sandbox Code Playgroud)
我用的时候
dbContext.As.Remove(someA)
Run Code Online (Sandbox Code Playgroud)
要删除A,我会遇到以下错误消息
The relationship could not be changed because one or more of the foreign-key properties is non-nullable
相反,如果我使用:
//remove all B in someA
foreach(B b in someA.Bs.ToList())
{
dbContext.Bs.Remove(b);
}
dbContext.As.Remove(someA)
Run Code Online (Sandbox Code Playgroud)
一切都好.
有一个更好的方法吗?
编辑
我正在使用Database First并在数据库端添加B的外键约束(在删除级联上).
我认为"外键约束"恰好等于代码"OnModelCreating".但代码"dbContext.As.Remove(someA)"无法按预期工作.
当ABC级联一对多关系时,事情变得更糟.为了删除someA,你需要这样做
foreach(B b in someA.Bs.ToList())
{
foreach(C c in b.Cs.ToList())
{
dbContext.Cs.Remove(c);
}
dbContext.Bs.Remove(b);
}
dbContext.As.Remove(someA);
Run Code Online (Sandbox Code Playgroud)
解决了:
我首先使用数据库(sqlite)并在数据库端添加外键约束.
使用vs2012从sqlite数据库文件创建edmx,
vs2012未能设置关系的"on delete cascade"属性.
手动设置属性后,单个调用"dbContext.As.Remove(someA)"按预期工作!
我使用反射和类型构建器构建动态类,所有,我想知道如何直接类型转换为c#类型
目前我正在这样做,但EF提供这种事情吗?
case "uniqueidentifier":
return typeof(Guid);
case "bit":
return typeof(Boolean);
case "nvarchar":
return (typeof(string));
case "datetime":
return typeof(DateTime);
case "float":
return typeof(double);
case "int":
return (typeof(int));
Run Code Online (Sandbox Code Playgroud)
谢谢
更新 我假设EF现在没有提供实用程序,可以公开访问.接受的答案与Ef无关.那里有不同的图书馆.
RyszardDżegan已给出答案,但不能在TT模板或edmx之外使用(或者我可能不知道)