Ajout et mise à jour de clé étrangère dans Entity Framework v1

entity-framework foreign-keys

Question

J'utilise .NET 3.5 SP1. J'ai créé l'entité 'Category', basée sur les tables 'category_table' et 'MyUser', basée sur la table 'App_User_table'.

CREATE TABLE category_table (
 catg_id int,
 catg_name varchar(50),
 catg_description varchar(250)
 )

CREATE TABLE App_User_table (
 userid int,
 username varchar(50),
 fullname varchar(50), catg_id int,
 fullAddress varchar(200),
 comments varchar(1000),CONSTRAINT FK_1 FOREIGN KEY (catg_id) REFERENCES Category_table (catg_id) 
)

public class Category: System.Data.Objects.DataClasses.EntityObject{    
 public int  CategoryId{get; set;}   
 public string CategoryName {get; set;} 
  ....
}

public class AppUser : System.Data.Objects.DataClasses.EntityObject{   
 public int Uid {get; set;}   
 public string UserName {get; set;}   
 public string Name {get; set;}   
 public string Address {get; set;}
 public string Comment {get; set;} 
 public Category category_table  { .. } 
 public System.Data.Objects.DataClasses.EntityReference<Category> category_tableReference {...}
 ...........   
}

Je souhaite ajouter et mettre à jour une entité AppUser dans une application ASP.NET MVC.

Pour ajouter:

//create entity with passed values
AppUser user = new AppUser(){Uid=id, ....  }
//Set EntityReference
user.category_tableReference.EntityKey = new System.Data.EntityKey("MyContext.CategorySet", "CategoryId", categoryIdSelected);
myContext.AddToCategorySet(user);
myContext.SaveChanges(true);

Pour mise à jour:

//create entity with passed Id 
AppUser user = new AppUser(){Uid=id  }
//Attach entitymyContext.AttachTo("UserSet", user);
//Update entity with passed values
user.Address = addr;
....

// met à jour l'ID de catégorie sélectionné à partir de DropDownList

user.category_tableReference.EntityKey = new System.Data.EntityKey("MyContext.CategorySet", "CategoryId", categoryId);

La méthode de mise à jour NE met PAS à jour CategoryId dans la base de données.

S'il vous plaît dites, quelle est la meilleure façon de résoudre le problème?

Je vous remercie.

Réponse acceptée

Voici l'approche que j'utiliserais pour la mise à jour dans une application MVC:

// Put the original Stub Entities for both the original User and its 
// original category. The second part is vital, because EF needs to know 
// original FK values to successfully do updates in 3.5 SP1
AppUser user = new AppUser {
    Uid = id, 
    Category = new Category {
        CategoryId = OriginalCategoryID
    }
};
ctx.AttachTo("UserSet", user);

// Then do this:
if (user.Category.CategoryId != categoryIdSelected)
{
    Category newCategory = new Category {CategoryId = CategoryIdSelected};
    // Attach because I assume the category already exists in the database
    ctx.AttachTo("CategorySet", newCategory);
    user.Category = newCategory;
}

// Update entity with passed values
user.Address = addr;
....

Comme vous pouvez le constater, vous devez pouvoir obtenir OriginalCategoryID de quelque part. Je vous recommande donc un champ masqué sur le formulaire.

Cela fera tout ce dont vous avez besoin. Consultez le conseil 26 - Comment éviter les requêtes de base de données en utilisant des entités de substitution pour plus d'informations sur l'astuce de l'entité de remplacement

J'espère que cela t'aides

Alex


Réponse populaire

UPDATE: voir les commentaires de Craig Stuntz et Alex James - je reste corrigé - il semble possible de simplement mettre à jour le "EntityKey" afin de réaliser ce que vous avez demandé. Mon post ici ne s'applique plus

Dans la version 1, Entity Framework ne peut pas fonctionner uniquement avec les valeurs de clés étrangères insérées. Vous devez ajouter l'instance d'objet "Category" à la propriété de navigation Cateogry de "AppUser":

//create entity with passed values
AppUser user = new AppUser(){Uid=id, ....  }

// set the Category navigation property
Category newUserCategory  = Category.GetbyID(4); // or whatever you need
user.Category = newUserCategory;

myContext.AddToCategorySet(user);
myContext.SaveChanges(true);

Avec EF v4, qui sera livré avec .NET 4.0 vers la fin de cette année (2009), vous pourrez alors définir uniquement la valeur de la clé étrangère pour créer des associations entre deux entités.

Voir plus d'informations à ce sujet ici:

Mais pour l'instant, vous devez définir l'objet complet - la référence ne suffit pas.

Marc



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow