Tại sao không hợp nhất tập hợp các thực thể hiện tại với các đối tượng được thêm vào? Tôi đã thử nghiệm ra điều này và có vẻ như work- nó không chiếm Xóa mặc dù, nhưng bạn sẽ có thể để có được những ý tưởng:
// get the entities that have been inserted or modified
var projects = myObjectContext.ObjectStateManager.GetObjectStateEntries(
EntityState.Added | EntityState.Modified).Where(
x => x.Entity is Project).Select(x=> (Project) x.Entity);
// get existing entities, exclude those that are being modified
var projects2 = myObjectContext.Projects.Where(
BuildDoesntContainExpression<Project, int>(z => z.ProjectId,
projects.Select(x => x.ProjectId)));
// Union the 2 sets
var projects3 = projects.Union(projects2);
BuildDoesntContainExpression: bạn không thể sử dụng chứa, và do đó bạn không thể làm ngược lại, với EF vì lý do nào đó, vì vậy hãy sử dụng phương pháp này:
private static Expression<Func<TElement, bool>> BuildDoesntContainExpression<TElement, TValue>(
Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values)
{
if (null == valueSelector)
{
throw new ArgumentNullException("valueSelector");
}
if (null == values)
{
throw new ArgumentNullException("values");
}
ParameterExpression p = valueSelector.Parameters.Single();
// p => valueSelector(p) == values[0] || valueSelector(p) == ...
if (!values.Any())
{
return e => false;
}
var equals = values.Select(
value => (Expression)Expression.NotEqual(valueSelector.Body, Expression.Constant(value, typeof(TValue))));
var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.And(accumulate, equal));
return Expression.Lambda<Func<TElement, bool>>(body, p);
}
Chính xác thì bạn đang cố gắng làm gì? Tại sao bạn cần truy cập vào bộ mới trước khi bạn cam kết? Bạn đang cố gắng thực hiện một số loại xác thực để ngăn chặn trùng lặp hoặc cái gì khác yêu cầu bạn so sánh các thực thể được chèn/sửa đổi với tất cả các thực thể khác trong tập hợp? – Merritt
Về cơ bản có. Nó không phải là quá nhiều mà tôi muốn ngăn chặn một cam kết nhưng tôi muốn cập nhật một thực thể dựa trên điều kiện của trạng thái hiện tại của tất cả các thực thể (thay đổi và không thay đổi). Đó là quy tắc kinh doanh giống như quy trình làm việc. Thật không may, nhà nước có thể thay đổi trong các dịch vụ khác nhau mà tôi gọi (với một bối cảnh được lưu trữ) mà không .savechanges(). Vì vậy, theo dõi những thay đổi này đang gây khó khăn. – itchi
Điều này nghe giống như một thao tác có thể được thực hiện bởi một dịch vụ/ứng dụng khác (hoặc trên một chuỗi khác ít nhất). Bạn có thể tạo một dịch vụ cửa sổ (hoặc một công việc sql) để xử lý các bản cập nhật? Có một số lý do nó phải được thực hiện trước khi SavingChanges()? – Merritt