ADO.NET Entity Framework 4.1 C # DAL создание / добавление объектов и доступ по ключу - PullRequest
0 голосов
/ 28 марта 2012

Я создал класс 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)!

1 Ответ

0 голосов
/ 28 марта 2012

Попробуйте изменить консольное приложение на:

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

Вы должны сначала сохранить свои данные в базе данных, а затем вызвать их по ключу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...