Entity framework RIA服务&x2B;实体框架服务器端插入更新删除-日志记录
首先,谢谢你的帮助。我正在使用ria服务插入/更新/删除实体,并保存这些操作的历史记录。我想在对服务的一次调用中执行该操作并保存历史记录。现在我被插入卡住了,因为我需要插入时生成的新实体ID。我可能采取了错误的方法(但我希望不会)。我已重写submit方法,正在尝试在历史记录表中保存快照,我不想保存原始版本的快照:Entity framework RIA服务&x2B;实体框架服务器端插入更新删除-日志记录,entity-framework,logging,wcf-ria-services,Entity Framework,Logging,Wcf Ria Services,首先,谢谢你的帮助。我正在使用ria服务插入/更新/删除实体,并保存这些操作的历史记录。我想在对服务的一次调用中执行该操作并保存历史记录。现在我被插入卡住了,因为我需要插入时生成的新实体ID。我可能采取了错误的方法(但我希望不会)。我已重写submit方法,正在尝试在历史记录表中保存快照,我不想保存原始版本的快照: public override bool Submit( ChangeSet changeSet ) { //SUBMIT FIRST SO THE
public override bool Submit( ChangeSet changeSet )
{
//SUBMIT FIRST SO THE OBJECT(S) HAVE AN ID
var success = base.Submit( changeSet );
if ( success )
foreach ( var changeSetEntry in changeSet.ChangeSetEntries )
{
if ( changeSetEntry.Entity is MyBusinessEntity )
{
var newBusinessEntity = (MyBusinessEntity) changeSetEntry.Entity;
RecordModifiedMyBusinessEntity( changeSetEntry.Operation, newBusinessEntity );
}
}
return success;
}
private void RecordModifiedMyBusinessEntity( DomainOperation operation, MyBusinessEntity newBusinessEntity )
{
var hist = new BusinessEntityHistory
{
ChangedBy = new AuthenticationService().GetUser().FriendlyName,
ChangedDate = DateTime.Now,
Operation = operation.ToString(),
BusinessEntityId = newBusinessEntity.Id,
Group = newBusinessEntity.Group,
Priority = newBusinessEntity.Priority,
....
};
InsertBusinessEntityHistory( hist );
//HERE IS WHERE I WANT TO CALL SUBMIT CHANGES AGAIN, BUT 1 - IT'S NOT IN THE CHANGESET,
//AND 2 - THE OBJECT I ALREADY INSERTED IS IN THE CHANGESET (SO IF I SUBMIT AGAIN, IT GETS
//INSERTED TWICE AND NO HISTORY IS SAVED. AND 3 - I CAN'T DO THE HISTORY BEFORE BECAUSE I DON'T
//HAVE THE ID, AND I DON'T WANT TO DO A MAX ID + 1 BECAUSE SOMEONE ELSE MIGHT BE
//INSERTING INTO THE SAME TABLE
}
以下是我最终采用的解决方案:
public override bool Submit( ChangeSet changeSet )
{
//submit the changes
var success = base.Submit( changeSet );
if ( success )
{
//make a new list of change set entries
var entries = new List<ChangeSetEntry>();
//each change set entry needs an id (not to be confused with the entity's id)
var maxId = 0;
//iterate through each change and add historical snapshot.
foreach ( var changeSetEntry in changeSet.ChangeSetEntries )
{
var entity = changeSetEntry.Entity;
var operation = changeSetEntry.Operation;
var myEntity = entity as MyEntityType;
if ( myEntity != null )
{
entries.Add( GetHistoryChangeSetEntry( ref maxId, operation, myEntity ) );
continue;
}
}
//make new change set with historical snapshots
var newChangeSet = new ChangeSet( entries );
//submit the new change set
base.Submit( newChangeSet );
}
return success;
}
private ChangeSetEntry GetHistoryChangeSetEntry( ref int maxId, DomainOperation operation, MyEntityType myEntity )
{
return new ChangeSetEntry
{
Id = ++maxId,
//We are inserting this change set entry
Operation = DomainOperation.Insert,
Entity = new MyEntityTypesHistory
{
ChangedBy = ServiceContext.User.Identity.Name,
ChangedDate = DateTime.Now,
//The operation performed on the original entity
Operation = operation.ToString(),
MyEntityId = myEntity.EntityId,
MyEntityField1 = myEntity.EntityField1,
MyEntityField2 = myEntity.EntityField2
}
};
}
public override bool Submit(变更集变更集)
{
//提交更改
var success=base.Submit(变更集);
如果(成功)
{
//创建更改集条目的新列表
var entries=新列表();
//每个变更集条目都需要一个id(不要与实体的id混淆)
var-maxId=0;
//迭代每个更改并添加历史快照。
foreach(changeSet.ChangeSetEntries中的var changeSetEntry)
{
var entity=changeSetEntry.entity;
var operation=changeSetEntry.operation;
var myEntity=作为MyEntityType的实体;
如果(myEntity!=null)
{
Add(GetHistoryChangeSetEntry(ref-maxId,operation,myEntity));
继续;
}
}
//使用历史快照创建新更改集
var newChangeSet=新变更集(条目);
//提交新的更改集
提交(新变更集);
}
回归成功;
}
私有ChangeSetEntry GetHistoryChangeSetEntry(ref int maxId,DomainOperation操作,MyEntityType myEntity)
{
返回新的ChangeSetEntry
{
Id=++maxId,
//我们正在插入此变更集条目
Operation=DomainOperation.Insert,
实体=新的MyEntityTypesStory
{
ChangedBy=ServiceContext.User.Identity.Name,
ChangedDate=DateTime。现在,
//对原始实体执行的操作
Operation=Operation.ToString(),
MyEntityId=myEntity.EntityId,
MyEntityField1=myEntity.EntityField1,
MyEntityField2=myEntity.EntityField2
}
};
}
我必须创建一个新的变更集,为其创建新的变更集条目,并使用新的变更集提交变更