2010-11-16 70 views
1

我想我可以用我的DbContext与我有任何MVC应用程序中使用它的DomainService用同样的方法:EF4代码只+ RIA服务

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); 
    } 
} 

的是,虽然查询的作品,删除和更新操作会抛出异常:

“该对象无法删除,因为它在ObjectStateManager中找不到。”

更新:解决方案

所以这就是我最终做的。仍然不确定这是否是正确的方法:

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); 
    } 
} 

回答

1

这个问题似乎与实体在删除它的时刻具有Detached实体状态相关联。
例如,对于类似问题的解决方案描述为here

+0

问题是我的用户是一个POCO类而不是一个EntityObject,所以它不知道EntityState。 – 2010-11-17 11:18:10

+0

在POCO实体的情况下,有几种方法。首先,看看这篇文章http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/15d54768-026a-4f86-b6e5-f40d39d9ef03 - 这里MSFT成员描述了一个解决方案。一个更有用的链接:http://msdn.microsoft.com/en-us/library/dd456854.aspx - 它描述了如何检测POCO实体的变化。 – Devart 2010-11-17 11:27:43