2012-03-28 38 views
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)!

回答

0

嘗試修改您的控制檯應用程序:

using (var manager = new FriendManager()) 
{ 
var id = manager.CreateFriend("John", "Fischer"); 
manager.SaveChanges(); 
var john = manager.GetFriend(id); 
Console.WriteLine("My new friend {0}.", john.Name); 
} 

您應該將數據保存到數據庫第一然後按鍵調用它。

+0

如果在「CreateFriend」之後的代碼中出現異常並且我想回滾,那麼在我明確表示如此之前要防止「SaveChanges()」會發生什麼? – moik 2012-03-28 10:48:51

+0

因爲你必須使用事務,所以你可以在事務中批量處理多個數據庫調用和多個操作,如果一個失敗,它就會返回一切。 http://msdn.microsoft.com/en-us/library/bb738523.aspx。您的主要問題是您可以只調用存儲在數據庫(或類似存儲)中的持久對象,對象。 – 2012-03-28 11:59:14

+0

請看看我的第一篇文章,我已經完全更新了! – moik 2012-03-28 12:47:56