2012-05-21 104 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/ –