2010-11-16 16 views
1

je pensais que je pouvais utiliser mon DbContext avec un DomainService la même façon que je l'utilise avec une application MVC:Code EF4 seulement + Ria services

public class DatabaseContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
} 

public class UserDomainService : DomainService 
{ 
    private DatabaseContext db; 

    public UserDomainService() 
    { 
     db = new DatabaseContext(); 
    } 

    public IQueryable<User> GetUsers() 
    { 
     return db.Users; 
    } 

    public void UpdateUser(User user) 
    { 
     db.Users.Attach(user); 
    } 

    public void DeleteUser(User user) 
    { 
     db.Users.Remove(user); 
    } 
} 

chose est que, tandis que le fonctionnement des requêtes, la suppression et Les opérations de mise à jour génèrent des exceptions telles que:

"L'objet ne peut pas être supprimé car il n'a pas été trouvé dans ObjectStateManager."

mise à jour: Solution

Alors ce que je finis par faire. Toujours pas sûr si cela est la bonne façon de le faire:

public class DatabaseContext : DbContext 
{ 
    public DbSet<User> Users { get; set; } 
    public new Context ObjectContext { get { return base.ObjectContext; } } 
} 

public class UserDomainService : DomainService 
{ 
    private DatabaseContext db; 

    public UserDomainService() 
    { 
     db = new DatabaseContext(); 
    } 

    public override bool Submit(ChangeSet changeSet) 
    { 
     bool submitResult = false; 

     try 
     { 
      submitResult = base.Submit(changeSet); 
      db.SaveChanges(); 
     } 
     catch 
     { 
     } 

     return submitResult; 
    } 

    public IQueryable<User> GetUsers() 
    { 
     return db.Users; 
    } 

    public void UpdateUser(User user) 
    { 
     db.Users.Attach(user); 

     var stateEntry = db.Context.ObjectStateManager 
            .GetObjectStateEntry(entity); 

     foreach (var propertyName in stateEntry.CurrentValues 
              .DataRecordInfo.FieldMetadata 
              .Select(fm => fm.FieldType.Name)) 
     { 
      stateEntry.SetModifiedProperty(propertyName); 
     } 
    } 

    public void DeleteUser(User user) 
    { 
     db.Users.Attach(user); 
     db.Users.Remove(user); 
    } 
} 

Répondre

1

La question semble être liée au fait que l'entité est détaché Etat de l'entité au moment où il est supprimé.
La solution pour un problème similaire est décrite par exemple here.

+0

Problème est mon utilisateur est une classe POCO pas un EntityObject, donc il ne connaît pas EntityState. –

+0

Dans le cas d'entités POCO, il existe plusieurs approches. Dans un premier temps, jetez un oeil à ce post http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/15d54768-026a-4f86-b6e5-f40d39d9ef03 - ici un membre MSFT décrit une solution. Un lien plus utile: http://msdn.microsoft.com/en-us/library/dd456854.aspx - il est décrit comment détecter les changements dans les entités POCO là. – Devart