我在尝试将对象添加到Entity Framework中的对象上下文时遇到问题.
这是代码:
//related object ids are retrieved from another context.
//since I thought the problem could be linked to object loaded in this context, I tried to
//close it and start on a fresh object context...
int idetab = currentEtab.Id;
long idnivcycle = selectedNivcycle.id_nivcycle;
long idanscol = AnneeScolaireEnCours.id_annee_scolaire;
//and this context is closed
context.Dispose();
//This is the new object context
objectcontextEntities ctest = new objectcontextEntities();
//from where I retrieve all the objects I want to link to the object …Run Code Online (Sandbox Code Playgroud) 我正在使用EF 4.3.1,我已经覆盖了上下文中的SaveChanges(),这样我就可以获得对象及其状态的列表,并在我的审计日志表中创建条目.我需要将记录的id存储在审计日志表中,以便我对它进行引用.插入记录时会出现问题,因为在保存之前我无法访问id.有什么方法可以获得身份证吗?
public override int SaveChanges()
{
ChangeTracker.DetectChanges();
var objectStateManager = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager;
var modifiedAuditableEntities = objectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Added).Where(e => (IAuditable)e.Entity != null);
foreach (var entry in modifiedAuditableEntities)
{
var entity = (IAuditable)entry.Entity;
if (entity != null)
{
switch (entry.State)
{
case EntityState.Added:
entity.IsAdded = true;
break;
case EntityState.Deleted:
entity.IsDeleted = true;
break;
case EntityState.Modified:
entity.IsModified = true;
break;
}
this.EntitySet<AuditLogEntry>().Add(this.auditLogService.CreateAuditLogEntryForEntity((IAuditable)entry.Entity));
}
return base.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud) 我有一个页面,它显示一个过滤的模型实例列表,并允许用户更新它的某些字段或添加新的字段作为表单.
我很好奇wpuld是一个聪明的方法,删除和重新保存所有输入数据或对每个数据进行比较并保存已编辑/新的字段和实体.
我想提醒你,我使用postgres来保存这些值,并且我显示了这个表单的大约20个条目.
这就是我们如何在WCF中为我们的EF实体实现通用的Save()服务.TT为我们工作.即使我们没有任何问题,我也不愿意认为这是最好的方法(即使它可能是).你们看起来很聪明,乐于助人,所以我想我会提出这样的问题:
有没有更好的办法?
[OperationContract]
public User SaveUser(User entity)
{
bool _IsDeleted = false;
using (DatabaseEntities _Context = new DatabaseEntities())
{
switch (entity.ChangeTracker.State)
{
case ObjectState.Deleted:
//delete
_IsDeleted = true;
_Context.Users.Attach(entity);
_Context.DeleteObject(entity);
break;
default:
//everything else
_Context.Users.ApplyChanges(entity);
break;
}
// now, to the database
try
{
// try to save changes, which may cause a conflict.
_Context.SaveChanges(System.Data.Objects.SaveOptions.None);
}
catch (System.Data.OptimisticConcurrencyException)
{
// resolve the concurrency conflict by refreshing
_Context.Refresh(System.Data.Objects.RefreshMode.ClientWins, entity);
// Save changes.
_Context.SaveChanges();
}
}
// return
if (_IsDeleted)
return null; …Run Code Online (Sandbox Code Playgroud) 现有的片段
foreach (var ownerCandidates in ownerToCandidatesDictionary)
{
foreach (var candidate in ownerCandidates.Value)
{
transactionEntities.AddToSomeEntity(someObject)
}
}
transactionEntities.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);
Run Code Online (Sandbox Code Playgroud)
正在重写
int i = 0 ;
foreach (var ownerCandidates in ownerToCandidatesDictionary)
{
foreach (var candidate in ownerCandidates.Value)
{
transactionEntities.AddToSomeEntity(someObject)
}
if ( i++ % 1000 == 0 )
{
transactionEntities.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);
}
}
transactionEntities.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);
Run Code Online (Sandbox Code Playgroud)
在程序成功终止的情况下,我们会提供相同的功能吗?我关注的是我们继续添加,循环中的SaveChanges只能使用自之前的SaveChanges以来添加的内容.我们这里有分批储蓄吗?如果不是这样的话,原始片段可以如何改变以避免
12/06/2012 7:50:37 PM : System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Data.Mapping.Update.Internal.Propagator.Project(DbProjectExpression node, PropagatorResult row, TypeUsage resultType)
at System.Data.Mapping.Update.Internal.Propagator.Visit(DbProjectExpression node)
at System.Data.Common.CommandTrees.DbProjectExpression.Accept[TResultType](DbExpressionVisitor`1 visitor)
at System.Data.Mapping.Update.Internal.Propagator.Propagate(UpdateTranslator parent, EntitySet table, …Run Code Online (Sandbox Code Playgroud) 我在visual studio中设置了一个新的umbraco项目,任何预装的模板,当我试图添加新的母版页时我无法保存它,我可以在visual studio中编辑它但我不能保存umbraco后端的任何变化.任何消化来解决我的问题?
我试图创建一个event handler这样的用户,当用户选择close(x)按钮时,它会提示用户保存任何未保存的更改.这是我的C#代码:
private void CloseFileOperation()
{
// If the Spreadsheet has been changed since the user opened it and
// the user has requested to Close the window, then prompt him to Save
// the unsaved changes.
if (SpreadSheet.Changed)
{
DialogResult UserChoice = MessageBox.Show("Would you like to save your changes?", "Spreadsheet Utility",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
switch (UserChoice)
{
case DialogResult.Yes:
SaveFileOperation();
this.Close();
break;
case DialogResult.No:
this.Close();
break;
case DialogResult.Cancel:
return;
}
}
// If the …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过 c# 中的 Visual Studio 2013 在基于实体框架的数据库上保存值。
我必须节省数据库拍卖数据。每个拍卖都有自己的 id,一个 int,这是它的主键。
当我尝试在数据库上添加拍卖时,我执行以下操作:
using(var c = new AuctionSiteContext(ConnectionString)
{
var auction = new Database.Auction
{
Id = auctionId, //auctionId=0
/*
other stuff
*/
};
c.Auctions.Add(auction);
c.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
问题是,auctionId 设置为 0,我通过调试器检查了它,但是当我执行 saveChanges(); 时 并再次控制该网站上唯一拍卖的值,其Id已更改为1。
老实说,我不明白为什么 savechanges() 调用可以更改该值,因为数据库上的拍卖列没有限制,我的意思是,为什么它不能简单地为 0?
每次我添加拍卖时都会这样做,id 增加 1,但所有其他参数保持不变。
编辑:我决定从 0 开始序列,这就是这个意思。但我什至尝试从 1 开始,这意味着第一次拍卖的 id=1,但在保存更改后它变成了 2。
我通过Entity Framework 4访问我的数据库.
我有一个服务器侦听端口,等待一些消息.当消息到来时,它将被转换为表行,并且应该将其插入到数据库中.但是,可以同时发送多条消息.对于每条消息,我创建一个Task(来自TPL)并异步执行它.
这些任务中的每一个都创建一个ObjectContext实例,创建相应实体类的对象(表示DB中的表),将数据插入ObjectContext,然后调用SaveChanges方法.
因此每个线程都创建了自己的ObjectContext.ObjectContext的实例是否可以影响ObjectContext的任何其他实例?这种情况会有副作用吗?
(请注意,插入的数据不会创建任何参照完整性错误).