【问题标题】:ADO.NET Entity Framework 4.1 C# DAL create/add objects and access by keyADO.NET Entity Framework 4.1 C# DAL 创建/添加对象并按键访问
【发布时间】: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


    【解决方案1】:

    尝试将您的控制台应用程序修改为:

    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);
    }
    

    您应该先将数据保存到数据库,然后按键调用它。

    【讨论】:

    • 如果“ create friend”之后的代码中发生异常,我想回滚,所以请防止“ savechanges()”在我明确地说?之前
    • 为了使用交易,您可以批量多个数据库调用和交易中的多个操作,如果失败了,它会使所有内容扮演。 msdn.microsoft.com/en-us/library/bb738523.aspx 。您的主要问题是您只能调用持久对象,即存储在数据库(或类似存储)中的对象。
    • 请看我最初的帖子,我已经完全更新了!
    • 您能否提供该问题的数据库结构,以便我重新创建它。如果我理解正确的话,如果您无法创建朋友的地址,您最终想销毁朋友吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多