2012-02-13 12 views
14

Tôi gặp sự cố khi thuộc tính của đối tượng mới được thêm vào không được tải xuống, nếu được yêu cầu ngay sau khi thêm đối tượng.Thực thể mã đầu tiên không tải thuộc tính lười biếng

Ví dụ:

Tôi có một thực thể người dùng với một tài sản JobRole ảo:

public class User 
{ 
    public int Id { get; set; } 

    public virtual JobRole JobRole { get; set; } 
    public int JobRoleId { get; set; } 

    public string Name { get; set; } 
} 

sau đó tôi thêm một tài khoản mới:

public User Add(User user) 
{ 
    var addedUser = _myContext.Users.Add(user); 
    myContext.SaveChanges(); 
    return addedUser; 
} 

Tham chiếu trở lại cho người dùng mới sau đó được chuyển đến một khung nhìn Razor, nơi nó cố gắng hiển thị JobRole (ví dụ như JobRole.Name). Tại thời điểm Người dùng được chuyển đến Chế độ xem, nó có:

  • JobRoleId đặt chính xác thành giá trị số nguyên.
  • JobRole = null

Sau đó tôi mong chờ JobRole để được lười biếng-nạp, khi được sử dụng bởi các View, nhưng nó không phải và kết quả là trong một ngoại lệ null-tham khảo.

Hành vi này có được mong đợi hay không hoặc có cách nào để có được các thực thể mới được thêm vào để tải xuống các thuộc tính của chúng không?

Cảm ơn trước vì bất kỳ ý tưởng nào.

Môi trường: Sử dụng khung pháp nhân 4.2 mã đầu tiên. Đã bật tải Lười.

+0

Tôi có vấn đề này và câu trả lời là đúng. Tuy nhiên, mã của tôi sử dụng cơ sở dữ liệu đầu tiên. Vì vậy, tôi đề nghị bạn chỉnh sửa tiêu đề để tìm kiếm trong tương lai có thể hạ cánh tại đây dễ dàng hơn. –

Trả lời

20

Đó là bởi vì các Phương thức DbSet.Add trả về cùng một đối tượng đã được chuyển cho đối số đó làm đối số, trong trường hợp của bạn không phải là phiên bản proxy do đó tải chậm không khả dụng.

Bạn nên tạo các đối tượng User đó được truyền cho DbSet.Add sử dụng phương pháp DbSet.Create, mà sẽ trở lại một trường hợp ủy quyền, và sau đó gán thuộc tính của nó trước sự bền bỉ nó thông qua DbContext.

Dưới đây là một ví dụ:

public User Add(User user) 
{ 
    var newUser = _myContext.Users.Create(); 

    // Copy the property values from 'user' to 'newUser' e.g. 
    // newUser.Name = user.Name 

    _myContext.Users.Add(newUser); 
    myContext.SaveChanges(); 

    return newUser; 
} 
+7

Hoàn hảo. Giải quyết vấn đề của tôi - cảm ơn rất nhiều. Để sao chép các thuộc tính của người dùng, tôi vừa thêm một dòng trước khi SaveChanges(): _myContext.Entry (newUser) .CurrentValues.SetValues ​​(user); Dường như làm việc tốt. – Appetere

+0

@Steve Điều đó thậm chí còn tốt hơn. Tôi rất vui vì tôi có thể giúp :) –

1

Bạn có thể thử hai điều, một trong những đầu tiên là thực thi háo hức nạp:

context.ContextOptions.LazyLoadingEnabled = false; 

Nếu điều này không làm việc, bạn có thể tải được thuộc tính bằng cách sử dụng này: http://msdn.microsoft.com/en-us/library/dd382880.aspx

+0

Cảm ơn bạn đã dành thời gian trả lời câu hỏi của tôi. Tuy nhiên, tắt tải chậm không làm cho mọi thứ háo hức tải - bạn cần "bao gồm" báo cáo cho điều đó chỉ áp dụng khi truy xuất các mục, không thêm chúng. Tôi có thể tải tài sản theo cách thủ công nhưng tôi thực sự cố gắng hiểu tại sao điều này không xảy ra tự động. – Appetere

+0

Bất cứ lúc nào. Không có gì. =) –

+0

Vâng, có thể vì bạn không thực thi tải với phương pháp bao gồm. Nếu ngữ cảnh của bạn bị tải chậm, thuộc tính mối quan hệ của lớp sẽ được tải vì là một thuộc tính của thực thể bạn, nhưng thuộc tính thực tế thì mối quan hệ đó sẽ không. –