Comment définir manuellement entité clé primaire dans Entity Framework code first base de données?
Bien, j'ai le modèle suivant de la structure: j'ai une classe DatabaseEntity
qui est essentiellement
public class DatabaseEntity
{
public int Id { get; set; }
}
de sorte que chaque entité comme produit, catégorie, etc héritera DatabaseEntity
et ont Id
de la propriété. J'ai également typique EntityFramework
référentiel de la classe avec InsertOrUpdate
méthode:
private readonly DbContext _database;
public void InsertOrUpdate<TObject>(TObject entity) where TObject : DatabaseEntity
{
if(entity.Id == default(int))
{
//New entity
DbSet<TObject>().Add(entity);
}
else
{
//Existing entity
_database.Entry(entity).State = EntityState.Modified;
}
_database.SaveChanges();
}
Puis-je télécharger à partir de eBay eBay via l'api liste des catégories que j'ai à ajouter à la base de données. Fondamentalement, catégorie:
public class EbayCategory : DatabaseEntity
{
//It has Id since it inherits DatabaseEntity
public string Name { get; set; }
//... some other properties
}
Mais, le problème c'est que quand j'ai télécharger les catégories que j'ai télécharger et leurs propriétés Id, ce qui, bien sûr, ont déjà des valeurs. Et quand j'essaie de les enregistrer dans la base de données comme:
public void UpdateCategories(IEnumerable<EbayCategory> newCategories)
{
foreach (var newCategory in newCategories)
{
_repository.InsertOrUpdate(newCategory);
}
}
J'face à des questions... tout d'Abord, entity.Id != default(int)
parce qu'il a de la valeur, de sorte référentiel tente de mettre à jour cette entité, plutôt que de l'ajouter, mais il n'est pas dans la base de données ou de contexte, de sorte qu'il jette l'exception suivante:
System.Data.Entity.Infrastructure.DbUpdateConcurencyException
"Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries."
... parce qu'il pense que quelqu'un d'autre supprimés entité qui je suis en train de mettre à jour. Comment puis-je enregistrer ce InsertOrUpdate logique, puisque beaucoup de projets sont fondés sur elle, et être en mesure d'ajouter des éléments (EbayCategories
) avec une clé primaire (Id
) à la base de données et ensuite mettre à jour/supprimer à l'instar d'autres entités sans jeter EbayCategory.Id
valeur?
Oui, j'ai BESOIN que la valeur de l'Id.
Et comment est l'Id de la situation pour les autres classes?
Je ne vois pas de toute façon que vous pouvez le faire SANS avoir à modifier votre
InsertOrUpdate
méthode.Vous pouvez changer votre méthode de vérification dans la base de données tout d'abord, comme dans l'interrogation par id et si l'article est là, mise à jour, le reste de l'insertion. Cependant, si il y a beaucoup d'éléments de ce qui pourrait coûter cher.
OriginalL'auteur Dmytro | 2014-04-11
Vous devez vous connecter pour publier un commentaire.
Pour vous permettre de générer manuellement Id vous avez besoin d'une classe qui a un générés manuellement l'ID de sorte qu'il ne peut pas hériter de
DatabaseEntity
Maintenant, vous aurez besoin d'un autre
InsertOrUpdate
pour gérer les entités qui ont généré manuellement clés:OriginalL'auteur Colin
Colin réponse ci-dessus, tout à fait correctement montre comment réaliser ce paramètre à l'aide des annotations de données.
Mais dans le problème de l'entité est une sous-classe de sorte que vous ne pouvez pas ajouter l'annotation sans changer la classe d'entité.
Il existe une autre méthode de configuration: Courant de Configuration. Voici mon exemple à l'aide d'un EntityTypeConfiguration classe:
Vous pouvez également ajouter directement la configuration de la modelBuilder que par ce post: https://stackoverflow.com/a/4999894/486028
OriginalL'auteur brendanrichards