Я использую следующий вызов RIA Services для регистрации и возврата объекта Project
.
// On Server; inside RIA Domain Service
[Invoke]
public Project CreateNewProject(String a_strKioskNumber)
{
Decimal dProjectID = ObjectContext.RegisterProjectNumber(a_strKioskNumber)
.FirstOrDefault() ?? -1m;
// Tried this but it returned zero (0)
//int nChanged = ObjectContext.SaveChanges();
var project = (from qProject in ObjectContext.Projects.Include("ProjectItems")
where qProject.ID == dProjectID
select qProject)
.FirstOrDefault();
if (project == null)
return null;
return project;
}
Как видите, он вызывает хранимую процедуру, которая возвращает идентификатор проекта. Этот идентификатор используется для поиска самой сущности Project
и ее возврата. Когда объект Project
возвращается клиенту, он отсоединяется. Я прикрепляю его к DomainContext
и модифицирую.
// At Client
_activeProject = a_invokeOperation.Value; // <-- Detached
_context.Projects.Attach(_activeProject); // <-- Unmodified
if (_activeProject != null)
{
_activeProject.AuthenticationType = "strong"; // <-- Modified
_activeProject.OwnerID = customer.ID;
_projectItems.Do(pi => _activeProject.ProjectItems.Add(pi));
_activeProject.Status = "calculationrequired";
}
На данный момент он имеет состояние сущности Modified
. Когда я отправляю изменения, это дает мне исключение в отношении нарушения UNIQUE KEY, как будто оно пытается вставить его, а не обновить.
// At Client
_context.SubmitChanges(OnProjectSaved, a_callback);
Я использую один и тот же экземпляр DomainContext
для всех операций. Почему это не должно работать?
Что не так? Это довольно сложно.
редактирует:
Я попробовал это (как предложено Джеффом):
[Invoke]
public void SaveProject(Project a_project)
{
var project = (from qProject in ObjectContext.Projects
where qProject.ID == a_project.ID
select qProject)
.FirstOrDefault();
project.SubmitDate = a_project.SubmitDate;
project.PurchaseDate = a_project.PurchaseDate;
project.MachineDate = a_project.MachineDate;
project.Status = a_project.Status;
project.AuthenticationType = a_project.AuthenticationType;
project.OwnerID = a_project.OwnerID;
project.ProjectName = a_project.ProjectName;
project.OwnerEmail = a_project.OwnerEmail;
project.PricePerPart = a_project.PricePerPart;
project.SheetQuantity = a_project.SheetQuantity;
project.EdgeLength = a_project.EdgeLength;
project.Price = a_project.Price;
project.ShipToStoreID = a_project.ShipToStoreID;
project.MachiningTime = a_project.MachiningTime;
int nChangedItems = ObjectContext.SaveChanges();
}
Это абсолютно ничего не сделало. Это не спасло проект.