2010-08-06 3 views
5

Я пытаюсь обновить отдельностоящий ПОКО ж/EF 4 CTP 4.Update EF 4 Feature CTP 4 Индивидуальный ПОКО

Мой класс домен выглядит следующим образом:

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

    [Required, DisplayName("First Name")] 
    public string FirstName { get; set; } 

    [Required, DisplayName("Last Name")] 
    public string LastName { get; set; } 

    [ConcurrencyCheckAttribute, Timestamp] 
    public byte[] DataVersion { get; set; } 
} 

В хранилище У меня есть следующие:

public void SaveUser(User user) { 
    if (user.Id > 0) { 
    dbContext.Users.Attach(user); 
    } 
    else { 
    dbContext.Users.Add(user); 
    } 
    dbContext.SaveChanges(); 
} 

dbContext наследует от DbContext.

Я в состоянии сделать вставки хорошо, но приложение не работает. Я запускаю Sql Profiler, и никакое sql не отправляется для обновления.

ответ

6

я разобрался ....

В классе DbContext я добавил метод, который помечает объект как измененный.

public void MarkAsModified(object entity) { 
    base.ObjectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified); 
} 

Мой метод репозитарий теперь выглядит как этот

public void SaveUser(User user) { 
    if (user.Id > 0) { 
    dbContext.Users.Attach(user); 
    dbContext.MarkAsModified(user); 
    } 
    else { 
    dbContext.Users.Add(user); 
    } 

    dbContext.SaveChanges(); 
} 
+0

привет. Я искал сейчас в течение длительного времени только для «обновления отдельного объекта в linq», и обе строки теперь работают «db.UserProfileSet.Attach (Пользователь)» 'db.ObjectStateManager.ChangeObjectState (Пользователь, EntityState.Modified) ' – Nasenbaer

2

Я знаю, что это в основном делает то же самое, но то, что я сделал это в вашем User Repository есть метод, называемый GetForUpdate или что-то подобное :

public User GetForUpdate(int id) 
{ 
    var u = new User(); 
    u.Id = id; 
    dbContext.Users.Attach(u); 
    return u; 
} 

Затем, когда вы хотите "обновление" пользователь с известным идентификатором:

var user = userRepo.GetForUpdate(id); 
user.Name = "John Doe"; 
user.Username = "john.doe"; 
userRepo.SaveUser(user); 

Прикрепление пользователя и , то изменяя свойства автоматически установит EntityState как Modified.

HTH

+0

Gotcha , Спасибо за совет. Единственная проблема с этим - я использую MVC и хотел бы воспользоваться привязкой модели. В вашем примере мне нужно будет вызвать repo.GetForUpdate, затем UpdateModel, а затем Сохранить. Но хорошо знать, что есть альтернативы. – xxx

+0

Извините, не могу ответить на ваш вопрос (недостаточно rep) – xxx

+0

@xxx - Не стоит беспокоиться. – TheCloudlessSky

Смежные вопросы