当我使用自我跟踪实体时实现方法

时间:2012-05-21 10:27:45

标签: wcf entity-framework self-tracking-entities

如何在WCF服务中使用自我跟踪实体来实现ServiceContract

这是我在 IPbService.cs

中的ServiceContract
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);


     }
}

这是我在 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;
            }
          }

     }
}

enter image description here

1 个答案:

答案 0 :(得分:2)

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

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

另一件事......我看到你使用不同的方法进行添加,更新和删除。我总是使用单一的Persist方法,就像这样:

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

自我跟踪实体上下文“知道”如何根据STE携带的ChangeTracker应用对实体所做的更改。所以你根本不需要单独的方法。很容易维护。

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

希望它有所帮助。