我已经开始研究在VS 2012中使用Entity Framework 5.0和MVC 4的应用程序.该应用程序连接到现有数据库,因此这是一个数据库第一站点.到目前为止,事情进展顺利.但我有一个我正在编写的方法,需要使用数据库端定义的函数.让我们称之为DoesItHaveAThingy(Guid id,字符串类型),它返回一个布尔值.该功能工作正常,已在该数据库上工作了几年.
所以我打开edmx设计器并右键单击,然后选择Update Model From Database.我选择我的功能并点击完成.它在Model.Store中添加了功能,您可以在模型浏览器中看到它.似乎一切都很好.但是没有生成代码.
我在网上看,人们说,一旦你完成了这一步,你需要做功能导入.好的,所以我右键单击设计器并点击Add - > Function import.它会弹出一个对话框,您可以在其中添加函数的名称.该对话框还有一个功能下拉列表,您需要选择一个.这就是问题所在,下拉列表是空的.所以我无法导入我需要的功能.
我猜我做错了什么.我想也许emdx文件添加了函数但是有错误.我有一个视图,检查文件,并在视图附近它有一个注释说明该视图的错误(它没有主键,然后再次,什么视图做).但我没有看到该功能的任何错误消息,它似乎添加好了.
它只是那个功能吗?不,尝试了另一个函数,相同的参数仍然返回一个int.同样的问题.
谢谢.
在某些情况下,在应用程序运行期间,我需要打开身份插入:
modelBuilder.Entity<Activity>().Property(p => p.Id).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
Run Code Online (Sandbox Code Playgroud)
但是,由于OnModelCreating只执行一次,实现这一目标的最佳方法是什么?是否有可能重建模型?
我们正在使用代码优先迁移构建应用程序.我们一直在使用Entity Framework 5.0.0 RC,我们更新了Entity Framework的NuGet包.数据库已与模型上下文同步.代码首次迁移已经好几个月了.
当我们修改模型,并尝试添加迁移,甚至查询迁移时,我们会收到System.InvalidOperationException,以便更改模型支持.
好吧,显然它有,我正在尝试添加迁移.
我们不确定该怎么做.如果删除更改,我可以成功运行Get-Migrations,并显示数据库已正确应用所有迁移.虽然ProductVersion列显示"5.0.0-rc.net45".
还有其他人遇到过这个问题吗?
使用.NET 4,MVC 4,Entity Framework 5,SQL Server;
我想在一个事务中插入一个新的Header记录和几个新的HeaderData记录,它们都有一个外键到插入的Header记录.标头记录具有Identity int主键.
Entities.Header h = new Entities.Header();
h.Name = name;
h.Time = DateTime.Now;
h.Comments = comments;
db.Headers.Add(h);
// db.SaveChanges(); // Save changes here?
// and get ID to use below via h.ID?
foreach (DataRecord dr in datarecords) // my own custom types here
{
Entities.HeaderData hd = new Entities.HeaderData();
// hd.header = thisid // ?? this is the FK to Header.ID, its Identity int PK
hd.name = dr.name
hd.value = dr.value
db.HeaderDatas.Add(hd)
}
db.SaveChanges(); …Run Code Online (Sandbox Code Playgroud) 我有一个使用Entity Framework的项目,但我不确定我使用的是哪个版本的EF.根据Microsoft版本的历史, EF5将自行安装:
如果使用Visual Studio 2012中的Entity Framework Designer创建新模型,EF5 NuGet包将安装到您的项目中,生成的代码将使用EF5.
但是我没有创建项目的EF部分,而是从版本控制(TFS)获得它.现在我不知道如何确定我是否有EF5.
如果我右键单击项目的References文件夹并选择Manage NuGet Packages,它会显示带有卸载按钮的EF5,这意味着我有EF5.
但是References文件夹中的system.data.entity在属性资源管理器中有一个运行时版本v4.0.30319和版本4.0.0.0,这意味着EF 4(根据我正在使用的实体框架的确定版本?).
我确实有这个app.config:
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
Run Code Online (Sandbox Code Playgroud)
这在我的web.config:
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<!--...-->
<dependentAssembly>
<assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<!--...-->
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
</entityFramework>
Run Code Online (Sandbox Code Playgroud)
任何人都可以澄清一下吗?
我有一个特定的计算字段,我经常想在Linq查询的"选择"字段中返回,例如今年的客户订单总数,以及客户的其他人口统计信息.
public class Customer {
public decimal TotalPurchasesThisYear(MyDataContext db) {
return db.Orders.Where(o => o.CustomerID == ID)
.Sum(o => o.OrderTotalAmt);
}
}
public class SomeReport {
public void GetCustomerInfoBySalesperson(long salespersonID) {
using (var db = new MyDataContext()) {
var q = db.Customers.Where(c => c.SalespersonID == salespersonID)
.Select(c => new { c.Name, c.Address, ThisYearPurchases = c.TotalPurchasesThisYear(db) })
.ToList();
// etc..
}
}
}
Run Code Online (Sandbox Code Playgroud)
显然,这不起作用,因为TotalPurchasesThisYear没有SQL翻译.但其中的所有内容都有SQL翻译.我不想直接在查询中包含该代码,因为我在很多地方进行相同的计算.我的直觉告诉我这应该用a来完成,Expression但是我已经玩过了,并且无法找到正确的语法.
帮忙,有人吗?谢谢!
我在我的数据访问层使用Entity Framework 5,ObjectContext和POCO.我有一个通用的存储库实现,我有一个方法,使用Skip()和Take()通过分页查询数据库.一切正常,但跳过很多行时查询性能非常慢(我说的是170k行)
这是我对Linq to Entities的查询的摘录:
C#代码:
ObjectContext oc = TheOBJEntitiesFactory.CreateOBJEntitiesContext(connection);
var idPred = oc.CreateObjectSet<view_Trans>("view_Trans").AsQueryable();
idPred = idPred.OrderBy(sortColumn, sortDirection.ToLower().Equals("desc"));
var result = idPred.Skip(iDisplayStart).Take(iDisplayLength);
return new PagedResult<view_Trans>(result, totalRecords);
Run Code Online (Sandbox Code Playgroud)
在翻译的查询到的Transact-SQL我注意到,而不是使用ROW_NUMBER()直接条款与鉴于其作出一个子查询和应用ROW_NUMBER()的子查询的结果...
例:
select top(10) extent1.A, extent1.B.extent1.C from (
select extent1.A, extent1.B, extent1.C,
row_number() OVER (ORDER BY [Extent1].[A] DESC) AS [row_number]
from (
select A,B,C from table as extent1)) as extent1
WHERE [Extent1].[row_number] > 176610
ORDER BY [Extent1].[A] DESC
Run Code Online (Sandbox Code Playgroud)
这需要大约165秒才能完成.有关如何提高翻译查询语句性能的任何想法?
当我更新我的EF模型(第5版)时,我遇到了一个奇怪的问题.它删除属于该模型的所有类.
我的情况是这样的.我更改了两个表的键列,这些表引用了我的主表.更新模型没有对edmx进行这些更改,因此我删除了这三个表(主表和两个查找表),保存了edmx.然后更新模型并重新添加这些表.
在更新后保存模型后,VS删除了此edmx的所有类文件.所有表格中的edmx看起来都还不错,只是课程已经消失了.然后,我必须恢复我的最后更改,然后再试一次.
有效的一件事是手动编辑edmx文件以对受影响的类进行适当的更改,但我不明白为什么我应该这样做.
有什么想法吗?
谢谢!
我使用EF CodeFirst,并希望使用包管理器控制台中的命令行在数据库中重新创建表,如何做到这一点?
问题是,虽然开发EF CodeFirst模型经常更改,但我手动删除数据库中的表,然后EF在第一次运行时重新创建它们.手动删除表需要花费时间,我认为它应该是一个在EF中从头开始重新创建表的命令.
我在Entity Framework 5中遇到了这个奇怪的问题,我想在其中一个实体中设置一个导航属性null.但由于某种原因,我第二次调用此属性时,属性才会被清除:
using (var db = new Entities())
{
var vehicle = db.Vehicles.Single(v => v.Id == vehicleId);
// After this call, ParkingBay is still set.
vehicle.ParkingBay = null;
// Only after this call, ParkingBay becomes null.
vehicle.ParkingBay = null;
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
VehicleEntity Framework生成的类如下所示:
public partial class Vehicle
{
public int Id { get; set; }
public System.DateTime CreatedOn { get; set; }
public int CreatedBy { get; set; }
public virtual ParkingBay ParkingBay { get; set; …Run Code Online (Sandbox Code Playgroud)