2010-09-05 7 views
0

J'essaie de supprimer un enregistrement de base de données en utilisant ASP.NET MVC, Fluent et NHibernate. Voir le code ci-dessous pour des exemples de comment j'essaye d'accomplir ceci. Je suis en mesure d'obtenir, mettre à jour et insérer des enregistrements, mais supprimer ne fonctionne pas. Lorsque la méthode Delete() est appelée dans le contrôleur (en haut), elle lance une exception (System.Data.SqlClient.SqlException: Invalid object name 'Styles'.).Comment supprimer un enregistrement?

Je voudrais éviter toute sorte de requête méta-SQL parce que je ne veux pas coder en dur le nom de la table dans le contrôleur si je n'ai pas à le faire.

contrôleur extrait de code:

// POST: /Brand/Delete/5 
// Here is the handler in the controller 
[HttpPost] 
public ActionResult Delete(int id, FormCollection collection) 
{ 
    try 
    { 
     IRepository<Brand> repo = new BrandRepository(); 
     repo.Delete(id); 

     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     throw; 
    } 
} 

extrait Repository:

//Here is the repository 
//The insert/update/get/etc all work fine 
void IRepository<Brand>.Delete(int id) 
{ 
    using (ISession session = NHibernateHelper.OpenSession()) 
    { 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      IRepository<Brand> repo = new BrandRepository(); 

      session.Delete(repo.GetById(id)); 
      transaction.Commit(); 
     } 
    } 
} 

Mapping extrait de code:

//And here is the mapping for a Brand 
public class BrandMap : ClassMap<Brand> 
{ 
    public BrandMap() 
    { 
     Table("Brands"); 
     Id(x => x.Id).GeneratedBy.Identity(); 
     Map(x => x.Name); 
     HasMany(x => x.Styles) 
      .Inverse() 
      .Cascade.All(); 
    } 
} 
+0

Quelle exception est levée? En ce qui concerne le codage en dur, vous avez déjà codé en dur un référentiel dans votre contrôleur afin que votre code soit étroitement lié à NHibernate. Attraper une exception sans réellement faire quelque chose avec elle comme par exemple l'enregistrer est une très mauvaise pratique. Aussi pourquoi diable êtes-vous en train de créer une nouvelle instance de 'BrandRepository' dans la méthode' Delete' qui, comme elle semble déjà faire partie de cette classe? –

+0

Il est difficile de savoir quelle exception est levée car je dois retourner une vue sinon elle ne va pas générer –

+0

Bien mettre un 'catch (Exception ex)' et déboguer la valeur de 'ex' ou même mieux, supprimez le bloc 'try/catch' et laissez l'exception propager. –

Répondre

1

Il semble que le mappage de la propriété Styles est incorrect. Utilisez-vous un nom de table correct? De l'exception, il semble qu'il n'y a pas une telle table Styles.

Questions connexes