2009-11-20 31 views
8

Tôi đang sử dụng Khung thực thể và các thực thể của nó được sử dụng là biểu diễn cơ sở dữ liệu VÀ đối tượng kinh doanh.
Vì vậy, nó có nghĩa là một số thực thể được chế tác nên luôn luôn tách ra khỏi bối cảnh.Ngăn chặn Khung đối tượng tự động đính kèm các đối tượng

Tôi đã quản lý để đọc và ghi dữ liệu từ cơ sở dữ liệu nhưng tôi gặp sự cố nhỏ khi cập nhật:
Tôi có bảng "Stock" được liên kết với một bảng "Warehouse".

Quá trình hiện nay là một này (đơn giản, nhưng tinh thần vẫn còn, có nhiều lĩnh vực):

  • một cổ vật mới được tạo và các lĩnh vực của nó được làm đầy với một số giá trị (ngày ...)
  • Kho hiện tại (đối tượng được kéo cho toàn bộ yêu cầu từ cơ sở dữ liệu) được liên kết với đối tượng Cổ phiếu
  • đối tượng được gửi đến phương pháp DAL hoạt động để lưu nó.
  • Phương pháp DAL kiểm tra xem mục Cổ đã tồn tại trong ngày (cùng ngày, kho và cùng loại) trong cơ sở dữ liệu
  • Nếu tồn tại, phương pháp sẽ cập nhật âm lượng từ đối tượng đã kéo và lưu thay đổi.
  • Khác, đối tượng Cổ phiếu mới được chèn vào.

Vấn đề ở đây là khi tôi có thể tạo đối tượng Cổ mới và liên kết nó vào kho, các EntityState đối tượng được tự động thiết lập để "thêm". Vì vậy, khi tôi thực hiện một SaveChanges() và cổ phiếu đã tồn tại, dòng được cập nhật VÀ một dòng cổ phiếu mới được thêm vào ...
Điều tôi muốn là giữ cho đối tượng Cổ mới được tách ra cho đến khi tôi tự gắn nó. Tôi không muốn điều đó xảy ra tự động.

Giải pháp duy nhất tôi tìm được là Tách đối tượng mới khỏi ngữ cảnh trước khi lưu nếu đối tượng đã tồn tại.
Tôi cũng có thể Detach() đối tượng Warehouse nhưng đó không phải là giải pháp thỏa mãn mà tôi nghĩ là trong trường hợp thực tế có nhiều mục để liên kết và tôi không chắc đó là ý tưởng hay khi chơi với Attach() và Detach() về họ.
Trong trường hợp này, cho đến khi tôi tự "thêm" nó vào ngữ cảnh, đối tượng chỉ là một đối tượng "Giao thông" và tôi muốn nó nằm ngoài ngữ cảnh.

Bất kỳ ý tưởng nào về cách tôi có thể giữ đối tượng Cổ bị tách ra?


Mã (nó có thể là một chút không chính xác, tôi đã viết nó bằng bộ nhớ):

Stock stk = new Stock(); 
stk.Date = DateTime.Now; 
stk.Volume = 100;   //so far stk is "Detached" and that's cool. 
stk.Warehouse = CurrentWarehouse; //stk become "Added" and that's less cool. 

DAL.Stock.Instance.Save(stk); 

Trong Save():

var existing = (from s in Context.CurrentContext.Stock 
where s.Warehouse.WarehouseId == stk.Warehouse.WarehouseId && s.Date == stk.Date && s.Type == 2 
select s).FirstOfDefault(); 

if(existing != null) 
{ 
    existing.Volume = stk.Volume; 
    Context.CurrentContext.Detach(stk); //I find it a stupid workaround !!!!!! 
} 
else 
{ 
    Context.CurrentContext.AddToStock(stk); //what I would want to do. 
} 

Context.CurrentContext.SaveChanges() 
+0

Tương tự với tôi! Bạn đã tìm ra chưa? –

+0

Đáng buồn là không.Và tôi không nhớ cách giải quyết mà tôi đã sử dụng. Tôi nghĩ rằng tôi bắt đầu sử dụng các đối tượng POCO. –

Trả lời

1

Bạn có lẽ chỉ muốn thiết lập các MergeOption với một giá trị thích hợp. NoTracking sẽ giữ mọi thứ ở trạng thái tách rời và cho phép bạn thực hiện công việc thủ công của mình. Có lẽ những cách khác để làm điều này, nhưng tôi đang làm một cái gì đó tương tự bằng cách thiết lập MergeOption để tách ra.

http://msdn.microsoft.com/en-us/library/system.data.services.client.dataservicecontext.mergeoption.aspx

Các vấn đề liên quan