【发布时间】:2012-03-28 20:47:45
【问题描述】:
我创建了一个 DAL 类“FriendManager”,封装了对我的实体的访问。
public class FriendManager
{
private readonly FriendsEntities _db;
public FriendManager()
{
_db = new FriendsEntities();
}
public void SaveChanges()
{
_db.AcceptAllChanges();
}
public Guid CreateFriend(string forename, string surname)
{
var id = Guid.NewGuid();
_db.Friends.AddObject(new Friend { Identifier = id, Name = string.Concat(forename, , " ", surname) });
_db.SaveChanges(SaveOptions.DetectChangesBeforeSave);
return id;
}
public void AddFriendsAddress(Guid friendId, string address)
{
var friend = GetFriend(friendId);
friend.Address = address;
_db.SaveChanges(SaveOptions.DetectChangesBeforeSave);
}
public Friend GetFriend(Guid id)
{
return (from friends in _db.Friends
where friends.Identifier == id
select friends).SingleOrDefault();
}
}
现在我想在控制台应用程序中创建一个朋友,然后通过在调用 SaveChanges() 之前立即访问它来将创建的条目写入命令行!
using (var manager = new FriendManager())
{
bool success = false;
try
{
using (var scope = new TransactionScope())
{
var id = manager.CreateFriend("John", "Fischer");
manager.AddFriendsAddress(id, "Blue Hole 12, 1234 Atlantic, World");
var john = manager.GetFriend(id);
Console.WriteLine("My new friend {0} lives in {1}.", john.Name, john.Address);
scope.Complete();
}
success = true;
}
catch(Exception ex)
{
Console.WriteLine("The following went wrong: {0}", ex.Message);
}
if (success) manager.SaveChanges();
}
Console.WriteLine("Press <ENTER> to exit...");
Console.ReadLine();
现在我收到 PK 违规错误,因为 EF 试图将 John 两次添加到我的 Friends 实体中!如果我不调用“_db.SaveChanges(SaveOptions.DetectChangesBeforeSave);”在“CreateFriend”方法中,则“AddFriendsAddress”失败,因为在 Friends 实体中找不到 John(“GetFriend”的返回值始终为 NULL)!
【问题讨论】:
标签: c# entity-framework-4 ado.net