2015-10-13 3 views
1

Je cherchais un moyen de générer automatiquement en ID pour une application ASP.NET MVC. Ceci est parce que je reçois cette erreur en essayant de mettre à jour la base de données:System.Data.SqlClient.SqlException: Impossible d'insérer la valeur NULL dans la colonne 'IngredientId', la table 'RecipeApplicationDb.dbo.IngredientModels';

System.Data.SqlClient.SqlException: Cannot insert the value NULL into column 'IngredientId', table 'RecipeApplicationDb.dbo.IngredientModels'; 

Ceci est le modèle:

public class IngredientModel 
{ 
     [Key] 
     public int IngredientId { get; set; } 

     [Required] 
     public string Name { get; set; } 
} 

C'est le contrôleur:

public class IngredientController : Controller 
{ 
    private RecipeApplicationDb db = new RecipeApplicationDb(); 

    public ActionResult Index() 
    { 
     //var ingredients = db.Ingredients.Include(i => i.DefaultUOM); 
     return View(); 
    } 

    public ActionResult Create() 
    { 
     return View(); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "IngredientId,Name,SeasonStartdate,SeasonEnddate")] IngredientModel ingredientModel) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Ingredients.Add(ingredientModel); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     ViewBag.IngredientId = new SelectList(db.UnitOfMeasures, "UnitOfMeasureId", "Name", ingredientModel.IngredientId); 
     return View(ingredientModel); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
      db.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 
} 

Je pense que la meilleure façon Pour résoudre ce problème, utilisez une expression Linq pour générer IngredientId. Pour cela, j'ai trouvé (entre autres) ce poste: How do I use Linq to obtain a unique list of properties from a list of objects? Quelqu'un pourrait me dire si c'est la bonne solution, et si oui, où je devrais mettre ce code.

Merci d'avance.

============= EDIT =====================

J'ai aussi créé un fichier de configuration avec ce contenu:

 #region Ingredienten 

     var italiaanseHam = new IngredientModel { Name = "Italiaanse Ham", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now }; 
     var zachteGeitenkaas = new IngredientModel { Name = "Zachte Geitenkaas", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now }; 
     var gedroogdeVeenbessen = new IngredientModel { Name = "Gedroogde Veenbessen", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now }; 
     var gemsla = new IngredientModel { Name = "Gemsla", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now }; 
     var stilton = new IngredientModel { Name = "Stilton", SeasonStartdate = DateTime.Now, SeasonEnddate = DateTime.Now }; 

     if (!context.Ingredients.Any()) 
     { 
      context.Ingredients.AddOrUpdate(
       i => i.IngredientId, 
       italiaanseHam, 
       zachteGeitenkaas, 
       gedroogdeVeenbessen, 
       gemsla, 
       stilton 
       ); 
     }; 

     #region Recipes 
     var LittleGemsal = new RecipeModel 
     { 
      Name = "Little Gemsla", 
      Description = "Little Gemsla met geitenkaas, veenbessen, gedroogde ham en stilton", 
      ImageUrl = "http://google.com", 
      RecipeLines = new List<RecipeLine> { 
       new RecipeLine { Quantity = 1, UnitOfMeasure = plak, Ingredient = italiaanseHam }, 
       new RecipeLine { Quantity = 100, UnitOfMeasure = gram, Ingredient = zachteGeitenkaas }, 
       new RecipeLine { Quantity = 2, UnitOfMeasure = eetlepel, Ingredient = gedroogdeVeenbessen }, 
       new RecipeLine { Quantity = 4, UnitOfMeasure = stuks, Ingredient = gemsla }, 
       new RecipeLine { Quantity = 1, UnitOfMeasure = stuks, Ingredient = stilton }, 
      } 
     }; 

     if (!context.Recipes.Any()) 
     { 
      context.Recipes.AddOrUpdate(
       i => i.RecipeId, 
       LittleGemsal 
       ); 
     }; 
     #endregion 

et mettre à jour la base de données que j'utilise package manager Console avec la commande:

Update-Database -Verbose -Force 

J'utilise aussi localdb pour ce projet, faire gestionnaire de base de données ne trouve pas la base de données.

+2

Vous souciez-vous de la valeur? vous pouvez simplement configurer votre base de données pour incrémenter automatiquement l'ID pour vous: http://stackoverflow.com/questions/10991894/auto-increment-primary-key-in-sql-server-management-studio-2012 – user1666620

+0

@ user1666620 Jusqu'à présent En ce qui me concerne, tout ce dont j'ai besoin est un identifiant unique. –

+0

Je voudrais certainement aller avec l'incrément d'identité de SQL Server comme @ user1666620 suggéré. Cela effacerait toute la question. –

Répondre

1

Dans la classe IngredientModel où vous avez défini votre modèle, ajoutez-le? après int, comme indiqué ci-dessous:

public int? IngredientsId {get; set;}  

Cela devrait contourner la valeur que vous permettant d'entrer nulle (vous pouvez vérifier si elle a été saisie d'une valeur lors de l'exécution du code).

Si l'entrée était null, supprimez l'annotation de données [Key]. Par défaut, votre première ligne dans la classe du modèle sera votre clé primaire.

Si cela ne fonctionne pas, utilisez cette annotation à la place [HiddenInput(DisplayValue = true)].

Il ne le résout pas lire quelques annotations de données.

0

Vous pouvez utiliser adnotation de données sur le terrain IngredientId:

[DatabaseGenerated (DatabaseGeneratedOption.Identity)]

Hope it helps.

+0

Cela ne devrait pas être nécessaire pour une colonne [Key] qui est un entier ... –