Я создал класс 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 пытается дважды добавить Джона в мою сущность Друзья! Если я не вызываю "_db.SaveChanges (SaveOptions.DetectChangesBeforeSave);" в методе «CreateFriend» происходит сбой «AddFriendsAddress», поскольку Джон не найден в сущности Friends (возвращаемое значение «GetFriend» всегда равно NULL)!