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?

Vous avez besoin de la valeur de l'Id? Pourquoi ne pas s'en débarrasser et laisser sql server génère une nouvelle Id via Identité?
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