如何在WCF服务中使用自我跟踪实体来实现ServiceContract
这是我在 IPbService.cs
中的ServiceContractnamespace 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;
}
}
}
}
答案 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()时,它将被修改和删除。
希望它有所帮助。