2012-05-21 69 views
0

如何,我可以使用自跟踪实体在WCF服务实现的ServiceContract实现方法当我使用自跟踪实体

这是我在IPbService.cs

namespace PhoneBookService 
{ 
    [ServiceContract] 
    public interface IPbService 
    { 
      [OperationContract] 
      List<User> GetAllUser(); 

      [OperationContract] 
      string AddUser(User user); 

      [OperationContract] 
      string DeleteUser(int id); 

      [OperationContract] 
      string UpdateUser(User user); 

      [OperationContract] 
      List<Contact> GetContactsByUser(int id); 

      [OperationContract] 
      string AddContact(Contact contact, string userName); 

      [OperationContract] 
      string DeleteContact(int id); 

      [OperationContract] 
      string UpdateContact(Contact contact); 


    } 
} 

和的ServiceContract这是我的在PbService.svc.cs

namespace PhoneBookService 
{ 
    public class PbService : IPbService 
    { 
      readonly PhoneBookDBEntities _context = new PhoneBookDBEntities(); 

      public List<User> GetAllUser() 
      { 
       return _context.Users.OrderBy(u => u.Name).ToList(); 
      } 

      public string AddUser(User user) 
      { 
      try 
      { 
       _context.Users.AddObject(user); 
       _context.SaveChanges(); 
       return ""; 
      } 
      catch (Exception e) 
      { 
       return e.Message; 
      } 
      } 

      public string DeleteUser(int id) 
      { 
      try 
      { 
       User user = _context.Users.FirstOrDefault(u => u.UserID == id); 
       _context.Users.DeleteObject(user); 
       _context.SaveChanges(); 
       return ""; 
      } 
      catch (Exception e) 
      { 
       return e.Message; 
      } 

      } 

      public string UpdateUser(User user) 
      { 
      try 
      { 
       if (user == null) throw new ArgumentNullException("user"); 
       User oldUser = _context.Users.FirstOrDefault(u => u.UserID == user.UserID); 
       if (oldUser != null) 
       { 
        oldUser.Name = user.Name; 
        oldUser.Password = user.Password; 
        oldUser.UserName = user.UserName; 
        oldUser.Email = user.Email; 
        oldUser.CreationDate = DateTime.Now; 
       } 
       _context.SaveChanges(); 
       return ""; 
      } 
      catch (Exception e) 
      { 
       return e.Message; 
      } 

      } 

      public List<Contact> GetContactsByUser(int id) 
      { 
       User user = _context.Users.FirstOrDefault(u => u.UserID == id); 
       if (user == null) throw new ArgumentNullException("id"); 
       return user.Contacts.OrderBy(c=>c.Name).ToList(); 
      } 

      public string AddContact(Contact contact, string userName) 
      { 
      try 
      { 
       User user = _context.Users.FirstOrDefault(u => u.UserName == userName); 
       if (user != null) user.Contacts.Add(contact); 
       _context.SaveChanges(); 
       return ""; 
      } 
      catch (Exception e) 
      { 
       return e.Message; 
      } 

      } 

      public string DeleteContact(int id) 
      { 
      try 
      { 
       Contact contact = _context.Contacts.FirstOrDefault(c => c.ContactID == id); 
       _context.Contacts.DeleteObject(contact); 
       _context.SaveChanges(); 
       return ""; 
      } 
      catch (Exception e) 
      { 
       return e.Message; 
      } 
      } 

      public string UpdateContact(Contact contact) 
      { 
      try 
      { 
       Contact oldContact = _context.Contacts.FirstOrDefault(c => c.ContactID == contact.ContactID); 
       if (oldContact != null) 
       { 
        oldContact.Name = contact.Name; 
        oldContact.PhoneNumber = contact.PhoneNumber; 
        oldContact.Email = contact.Email; 
        oldContact.Mobil = contact.Mobil; 
        oldContact.Address = contact.Address; 
       } 
       _context.SaveChanges(); 
       return ""; 
      } 
      catch (Exception e) 
      { 
       return e.Message; 
      } 
      } 

    } 
} 

FPGA实现类

+0

PbModel.Context.tt建议您已经应用了ADO.net自我跟踪实体生成器,那么我们是否可以假设您的问题是关于如何正确使用这些实体? –

+0

@GertArnold是的我问我如何在PbService.svc.cs文件中使用自我跟踪..重新实现这些方法 – tito11

回答

2

在你的WCF项目中,你只需要引用你的EntityClasses项目。那简单?!我想是这样的...

您的自我跟踪实体已经为其携带的属性配备了正确的DataMember属性。

另一件事...我看到你使用不同的方法来添加,更新和删除。我总是用一个单一的方法坚持的东西是这样的:

using(Entities context = new Entities()) 
{ 
    try 
    { 
    context.ApplyChanges(user); 
    context.SaveChanges(); 
    } 
    catch 
    { 
    ... 
    } 
} 

自追踪实体中,“知道”如何应用到基于STE将携带着ChangeTracker实体所做的更改。所以你根本不需要单独的方法。很容易维护。

因此,当您在某些客户端应用程序中创建新实体时,ChangeTracker.State将为ObjectChangeTrackerState.Add,并且在修改现有实体时,它将在您使用entity.MarkAsDeleted()时进行修改和删除。

希望它有帮助。

+0

感谢@YoupTube我如何使用ApplyChanges(用户)代替我的方法?就像您的代码一样? ? – tito11

+1

@ tarek11011是的,就像我的代码一样。无论何时应用更改,需要插入(State = Added),更新(State = Modified)还是删除(State = Deleted),上下文都知道如何处理自追踪实体。此信息在实体的ChangeTracker中维护。 –

+0

必须阅读:http://learnentityframework.com/ –