0
我創建了一個DAL類「FriendManager」,封裝了我的實體的訪問權限。ADO.NET實體框架4.1 C#DAL創建/添加對象並通過鍵訪問
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實體中找不到John(返回值「GetFriend」始終爲NULL)!
如果在「CreateFriend」之後的代碼中出現異常並且我想回滾,那麼在我明確表示如此之前要防止「SaveChanges()」會發生什麼? – moik 2012-03-28 10:48:51
因爲你必須使用事務,所以你可以在事務中批量處理多個數據庫調用和多個操作,如果一個失敗,它就會返回一切。 http://msdn.microsoft.com/en-us/library/bb738523.aspx。您的主要問題是您可以只調用存儲在數據庫(或類似存儲)中的持久對象,對象。 – 2012-03-28 11:59:14
請看看我的第一篇文章,我已經完全更新了! – moik 2012-03-28 12:47:56