【问题标题】:implement methods when i use Self-Tracking Entities在我使用自我跟踪实体时实施方法
【发布时间】:2012-05-21 10:27:44
【问题描述】:

我如何使用 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;
            }
          }

     }
}

【问题讨论】:

  • PbModel.Context.tt 表明您已经应用了 ADO.net 自跟踪实体生成器,那么我们可以假设您的问题是关于如何正确使用这些实体吗?
  • @GertArnold 是的,我询问了如何在 PbService.svc.cs 文件中使用自我跟踪来重新实现这些方法

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


【解决方案1】:

在您的 WCF 项目中,您只需要引用您的 EntityClasses 项目。这么简单?!我想是的……

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

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

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

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

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

希望对你有帮助。

【讨论】:

  • 感谢@YoupTube 我如何使用 ApplyChanges(user) 代替我的方法?就像你的代码一样??
  • @tarek11011 是的,就像我的代码一样。无论何时应用更改、是否需要插入(状态 = 添加)、更新(状态 = 修改)或删除(状态 = 已删除),上下文都知道如何处理自我跟踪实体。此信息保存在实体的 ChangeTracker 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多