Entity Framework - l'Insertion d'enregistrements dans la table enfant lors de l'enregistrement parent existe déjà

Bon après-midi-

Je développe une application Silverlight à l'aide de LINQ to Entity Framework pour la couche d'accès aux données. Mon n-tier modèle de base de données comprend environ 30 tables, avec un certain nombre de multi-niveaux des relations parent-enfant tout au long de. Récemment commencé à écrire mes services de données et les tests unitaires, et nous avons découvert un problème avec l'insertion d'un nouvel enregistrement dans une table d'enfant lorsque le parent enregistrement de la table est déjà défini. Voici une version abrégée de mes tables parent et enfant:

TABLE PARENT:

Utilisateurs
id d'utilisateur (PK)
e-Mail
Mot de passe
etc...

TABLE ENFANT:

Userprofile
UserProfileID (PK)
Diverses informations sur le profil...
id d'utilisateur (FK -- table des Utilisateurs)

Donc, à ce moment, j'ai l'Entity Framework a déjà été utilisé pour créer mes différentes classes pour l'ORM, et je suis à la recherche pour créer des services de données pour les opérations CRUD sur mes entités. Voici un exemple de code pour ma méthode pour insérer un nouveau Utilisateur (qui n'a pas de parent références de table):

    public User CreateUser(User newUser)
    {
        using (var _context = new ProjectDatabase())
        {
            newUser.CreatedDate = DateTime.Now;
            newUser.ModifiedDate = DateTime.Now;
            _context.AddToUsers(newUser);
            _context.SaveChanges();
        }

        return newUser;
    }

Cela fonctionne bien. J'ai écrit des tests unitaires pour ça, pas de problème. Maintenant, d'autre part, considérons les données suivantes de la méthode du service que j'ai écrit pour insérer un nouveau Utilisateur de l'objet dans la base de données. Pour commencer, j'ai une très semblables service de données:

    public UserProfile CreateProfile(UserProfile newUserProfile)
    {
        using (var _context = new ProjectDatabase())
        {
            newUserProfile.CreatedDate = DateTime.Now;
            newUserProfile.ModifiedDate = DateTime.Now;
            _context.AddToUserProfiles(newUserProfile);
            _context.SaveChanges();
        }

        return newUserProfile;
    }

Ce code, tout comme les autres, se compile sans problème. Cependant, mon test de l'unité ne parvient pas. Voici le code de mon test de l'unité:

    [TestMethod]
    public void UserProfileCrudTest()
    {
        IProfileDataService _dataService = new ProfileDataService();

        //Pre-seeded data on a State for foreign key
        State _myState;
        using (var _context = new ProjectDatabase())
        {
            _myState = _context.States.First();
        }

        //Creating temporary User for association with new UserProfile
        User _myUser = new User()
                  {
                      Email = "test",
                      Password = "test",
                      IsActive = true,
                      NameFirst = "test",
                      NameLast = "test"
                  };

        _myUser = _dataService.CreateUser(_myUser);
        Assert.IsNotNull(_myUser);

        //Attempt to create new UserProfile, assigning foreign key
        _myUserProfile = new UserProfile()
                 { 
                     Address = "123 Main", 
                     City = "Anywhere", 
                     State = _myState, 
                     PostalCode = "63021", 
                     UserID = _myUser.UserID 
                 };

        //This call to CreateProfile throws an exception and the test fails!!
        _myUserProfile = _dataService.CreateProfile(_myUserProfile);
        Assert.IsNotNull(_myUserProfile);

        //Remaining test code... never gets this far... 
    }

Donc, à ce moment, mon test de l'unité déclenche l'exception suivante:

Méthode d'essai MyProject.Data services.Les Tests.SecurityTests.UserProfileCrudTest jeté exception:
Système.InvalidOperationException: Le EntityKey de propriété ne peut être réglé que lorsque la valeur actuelle de la propriété est null.

Ce que je comprends de mes recherches jusqu'à présent, c'est en quelque sorte attachant retour à la propriété de navigation qui associe la nouvelle de l'Utilisateur de l'objet avec l'Utilisateur.Userprofile collection sur la table parent/objet. Mais je ne suis pas sûr de ce que des mesures sont nécessaires pour résoudre le problème. Dois-je en quelque sorte besoin de joindre le parent à ObjectContext? Toute aide serait GRANDEMENT appréciée!

Grâce,
Jeff S.

OriginalL'auteur jeffreystrauss | 2010-08-26