我已经被这个问题困住了一个多星期了.希望有人能指出我正确的方向.
我首先简要介绍一下我的架构.
资产1 ---> 1地址* - > 1区* - > 1区* - > 1国家
套餐1 - >*资产
使用自我跟踪实体(STE)+ WCF.
脚步:
在步骤2中,呼叫使用预先加载的地址.
from p in context.Assets.Include("Address.Area.Region.Country")
Run Code Online (Sandbox Code Playgroud)
这是尝试呼叫时的错误
context.Packages.ApplyChanges(package)
Run Code Online (Sandbox Code Playgroud)
AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突.在调用AcceptChanges之前,请确保键值是唯一的.
编辑
在窥探之后,我发现这是一个STE问题.问题是您无法持久存储包含此处概述的同一实体的多个实例的图形.这是我的问题.
如何将实体添加到我的实体集合中.新实体可能具有包含与集合中已有密钥相同的密钥的相关实体.即添加可能包含相同地址,区域,地区或国家/地区实体的新资产.
这是我的约束:
我知道Diego B Vega建议的可能解决方案,但这些不是我可以用于我的解决方案的选项.有没有人有任何其他想法?
假设你有这样的代码.
using (CustomerContext db = new CustomerContext())
{
var foundCustList=db.Customers.Where(c=>c.State=='-1').ToList();//Find all the customer which State is -1
foreach(var c in foundCustList)
{
db.DeleteObject(c);
}
db.SaveChanges();//After all the customer is deleted, Commit.
}
Run Code Online (Sandbox Code Playgroud)
但我想知道有没有办法轻松删除对象列表?我不想foreach一个接一个地使用它来做列表.谢谢.
我正在构建一个4层ASP.Net Web应用程序.这些图层是:
实体层具有我的数据模型类,并使用T4模板(POCO)从数据层中的实体数据模型(edmx文件)构建.实体层在所有其他层中引用.
我的数据层有一个名为SourceKeyRepository的类,它具有如下函数:
public IEnumerable<SourceKey> Get(SourceKey sk)
{
using (dmc = new DataModelContainer())
{
var query = from SourceKey in dmc.SourceKeys
select SourceKey;
if (sk.sourceKey1 != null)
{
query = from SourceKey in query
where SourceKey.sourceKey1 == sk.sourceKey1
select SourceKey;
}
return query;
}
}
Run Code Online (Sandbox Code Playgroud)
由于我不希望我的查询在此应用程序的其他层中运行,因此禁用了延迟加载.尝试访问UI层中的信息时,我收到以下错误:
ObjectContext实例已被释放,不能再用于需要连接的操作.
我确定这是因为我的DataModelContainer"dmc"被处理掉了.如何从我的数据层返回此IEnumerable对象,以便它不依赖于ObjectContext,而只依赖于DataModel?
有没有办法限制延迟加载只发生在数据层?
我正在使用最新版本的ASP.NET MVC,SQL Server和Entity Framework.我没有先使用代码.
我可以使用我的EDMX文件生成的类轻松创建对象上下文.
但有没有办法DBContext从该类中获取对象?我想使用它的扩展功能.
我在刷新数据库中的对象时遇到问题.我有两个PC和两个应用程序.
在第一台PC上,有一个与我的数据库通信的应用程序,并将一些数据添加到Measurements表中.在我的另一台PC上,有一个应用程序可以在一个计时器下检索最新的测量,所以它应该在我的第一台PC上检索应用程序添加的测量结果.
问题是它没有.在我的应用程序启动时,它会缓存数据库中的所有数据,并且永远不会添加新数据.我使用Refresh()方法,当我更改任何缓存数据时它很有效,但它不刷新新添加的数据.
这是我应该更新数据的方法:
public static Entities myEntities = new Entities();
public static Measurement GetLastMeasurement(int conditionId)
{
myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements);
return (from measurement in myEntities.Measurements
where measurement.ConditionId == conditionId
select measurement).OrderByDescending(cd => cd.Timestamp).First();
}
Run Code Online (Sandbox Code Playgroud)
PS应用程序在app.config中有不同的连接字符串(同一个数据库的不同帐户).
我刚刚下载了EntityFramework.dll v4.3.我发现了一些用于比较的问题DbContext对ObjectContext.但其中大部分来自2010年或2011年初.
我想更多地了解这个主题.具体来说,有没有DbContext可以拿到书的书?我还想知道,截至今天,DbContext将它与其哥哥比较时有哪些局限性ObjectContext?
我意识到它DbContext更紧凑,因为它暴露更少的属性.这告诉我,我应该从中迁移ObjectContext.但是,如果我进行此迁移,我会放弃任何功能吗?例如,我读过DbContext没有STE(自跟踪实体)功能.这是否仍然适用,这是一个问题吗?
阅读这篇题为"使用ObjectSet(实体框架)"的MSDN文章它显示了两个如何添加产品的示例..一个用于3.5,另一个用于4.0.
http://msdn.microsoft.com/en-us/library/ee473442.aspx
由于我缺乏知识,我可能在这里完全遗漏了一些东西,但我从未添加过这样的产品:
//In .NET Framework 3.5 SP1, use the following code: (ObjectQuery)
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
// Add the new object to the context.
context.AddObject("Products", newProduct);
}
//New in .NET Framework 4, use the following code: (ObjectSet)
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
// Add the new object to the context.
context.Products.AddObject(newProduct);
}
Run Code Online (Sandbox Code Playgroud)
我不会这样做,只是使用:
// (My familiar way)
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
// Add the new object to the context.
context.AddToProducts(newProduct);
} …Run Code Online (Sandbox Code Playgroud) 我为这个问题缺乏细节而道歉 - 我需要帮助的第一件事就是知道在哪里寻找更多细节.
我有一个enity框架4导航属性的问题,显然在提交更改时导致性能不佳:
this.ObjectContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
当其中一个导航属性(收据表)包含大约8000行(这不是很多,所以应该没问题)时,需要30多秒.
我使用过SQL分析器,可以看到EF从Receipts发出select*并且它非常慢:
exec sp_executesql N'SELECT
[Extent1].[Id] AS [Id],
// full field list cut for brevity
FROM [dbo].[Receipts] AS [Extent1]
WHERE [Extent1].[WarehouseId] = @EntityKeyValue1',
N'@EntityKeyValue1 int',@EntityKeyValue1=1
Run Code Online (Sandbox Code Playgroud)
目前,当调用ObjectContext.SaveChanges()时,我甚至无法理解为什么需要从该表中选择所有行.
它确实需要在此表中插入1行,但这并不能解释为什么它首先执行select - 并且不能解释为什么select会花费这么长时间(同一查询在查询管理器中占用<1秒)
所以我现在的问题 - 我还不知道问题是什么 - 是:
编辑:
我已经通过注释掉对此方法的调用来确认收据代码很慢:
private void AddReceipt(PurchaseInvoice invoice,
PurchaseInvoiceLine invoiceLine)
{
if (invoice != null && invoiceLine != null)
{
Product product = invoiceLine.Product;
if (product != null)
{
Receipt receipt = new Receipt{ foo = bar }; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Context.Refresh方法恢复上下文更改,但似乎Refresh不是Context的成员.
我正在使用Microsoft ADO.NET Entity Framework 4.1 RC版本.
任何的想法?
我正在创建一个委托来检索数据库中的所有专辑记录.我在另一个项目中使用了相同的方法,但由于某种原因我这次收到错误.
我错过了一步吗?我不确定为什么会出现这个错误.
码
public static readonly Func<CodySolutionEntities, IQueryable<Album>> SelectAlbums =
CompiledQuery.Compile<CodySolutionEntities, IQueryable<Album>>(
query => from q in query.Albums.Include("Photo")
select q);
Run Code Online (Sandbox Code Playgroud)
错误
错误1类型'CodyData.Diagram.CodySolutionEntities'不能用作类型 parameter 'TArg0' in the generic type or method 'System.Data.Objects.CompiledQuery.Compile<TArg0,TResult>(System.Linq.Expressions.Expression<System.Func<TArg0,TResult>>)'. There is no implicit reference conversion from 'CodyData.Diagram.CodySolutionEntities' to 'System.Data.Objects.ObjectContext'. C:\Users\Cody\Documents\CMBS\CodySolution\CodyData\Delegates\PhotoDelegates.cs 13 13 CodyData
objectcontext ×10
c# ×2
dbcontext ×2
.net ×1
asp.net ×1
database ×1
lazy-loading ×1
performance ×1
sql-server ×1
wcf ×1
wpf ×1