2017-02-02 6 views
1

Ich bin ziemlich neu in C# und Visual Studio MVC und arbeite an einem einfachen Projekt, bei dem ich eine Seite mit Kommentaren implementieren muss, die über ein Formular (das ich noch nicht implementiert habe) gepostet werden kann. . Hier ist mein Problem, ich bekomme immer den Fehler 'ungültige Spalten-ID'. Ich habe alle Antworten im Internet nachgeschaut, aber nichts gefunden, was mein Problem korrigiert hat. Ich komme aus Java, also sind mir einige Konzepte nicht wirklich klar, besonders seit ich gestern angefangen habe.Ungültiger Spaltenname C#

Hier ist mein Kontext:

namespace MonLivredor.Models { 
public class CommentaireContext: DbContext { 
    public CommentaireContext() {} 
    public IDbSet <Commentaire> Liste { 
     get; 
     set; 
    } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
     Database.SetInitializer <CommentaireContext> (null); 
     base.OnModelCreating(modelBuilder); 
     } 
    } 
} 

Und hier mein Controller:

using MonLivredor.Models; 
using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace MonLivredor.Controllers 
{ 
public class CommentaireController : Controller 
{ 
    private CommentaireContext context = new CommentaireContext(); 
    // GET: Commentaire 
    public ActionResult Commentaire() 
    { 

     Commentaire com1 = new Commentaire("Jacky", "[email protected]", "Bonjour je m'apelle Jacky et j'aime le C#"); 
     Commentaire com2 = new Commentaire("Bobby", "[email protected]", "Bonjour je m'apelle Bobby et je deteste le Java"); 

     if (context.Liste.Count() == 0) 
     { 
      context.Liste.Add(com1); 
      context.Liste.Add(com2); 
      context.SaveChanges(); 
      return View(context); 
     } 
     else 
     { 
      return View(context); 
     } 
    } 

Modell:

namespace MonLivredor.Models 
{ 
[Table("Commentaires")] 
public class Commentaire 
{ 
    [Key] 
    public int ID { get; set; } 
    [Required] 
    public String Nom { get; set; } 
    public String Mail { get; set; } 
    public String Message { get; set; } 
    public DateTime date; 
    public int i = 0; 

    public Commentaire(String nom, String mail, String message) 
    { 
     date = DateTime.Now; 
     this.Nom = nom; 
     this.Mail = mail; 
     this.Message = message; 
     ID = i; 
     i++; 
    } 

    public Commentaire() 
    { 
     date = DateTime.Now; 
    } 


} 
} 

Meiner Ansicht nach um die Nachrichten zu sehen, ich will nur in der Lage sein:

@model MonLivredor.Models.CommentaireContext 
<h1>Commentaires</h1> 

<tr> 
@foreach (var com in Model.Liste) 
{ 
    <td> 
     <a href="mailto:com.Mail">@com.Nom @com.date</a> 
     <p>@com.Message</p> 
    </td> 

} 
</tr> 

Entschuldigung für den unordentlichen Code, ich habe mir die Haare ausgerissen, und die Antwort ist wahrscheinlich albern. Wenn ich den Fehler, werde ich auf die Ansichtsseite auf der Linie umgeleitet:

@foreach (var com in Model.Liste) 

mit dem Fehler ‚ungültige Spaltennamen-ID‘.

Stapelüberwachung:

[SqlException (0x80131904): Invalid column name 'ID'.] 
    System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +2442126 
    System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5736904 
    System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +628 
    System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +3731 
    System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +58 
    System.Data.SqlClient.SqlDataReader.get_MetaData() +89 
    System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +379 
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest) +2026 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +375 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53 
    System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +240 
    System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +41 
    System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +12 
    System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<Reader>b__c(DbCommand t, DbCommandInterceptionContext`1 c) +9 
    System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch(TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) +72 
    System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext) +356 
    System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior) +166 
    System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +12 
    System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +37 

[EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.] 
    System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +112 
    System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute(ObjectContext context, ObjectParameterCollection parameterValues) +744 
    System.Data.Entity.Core.Objects.<>c__DisplayClass7.<GetResults>b__6() +97 
    System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction(Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess) +288 
    System.Data.Entity.Core.Objects.<>c__DisplayClass7.<GetResults>b__5() +154 
    System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Func`1 operation) +189 
    System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +279 
    System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0() +11 
    System.Data.Entity.Internal.LazyEnumerator`1.MoveNext() +45 
    System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +381 
    System.Linq.Enumerable.ToList(IEnumerable`1 source) +58 
    MonLivredor.Controllers.CommentaireController.Commentaire() in C:\Users\Bob\documents\visual studio 2015\Projects\MonLivredor\MonLivredor\Controllers\CommentaireController.cs:26 
    lambda_method(Closure , ControllerBase , Object[]) +62 
    System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14 
    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +157 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +22 
    System.Web.Mvc.Async.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) +29 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32 
    System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +50 
    System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +225 
    System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +10 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34 
    System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +26 
    System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 
    System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 
    System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36 
    System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 
    System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26 
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 
    System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9744373 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 

Danke für Ihre Hilfe

+0

Wie sieht die 'Commentaires' Datenbanktabelle aus? Es wird erwartet, dass die Spalte "ID" dort vorhanden ist. –

+0

Ich habe keinen erstellt, also ist das vielleicht das Problem ... Unser Lehrer hat uns Schritt für Schritt erklärt, ohne eine Datenbank zu erstellen, und einige meiner Kollegen haben es ohne Datenbankerstellung geschafft. –

+0

Es sieht so aus, als ob Sie versuchen, eine Identitäts-/Autonummerspalte manuell zu implementieren. Tu das nicht (wenn du das mit "i" versuchst) –

Antwort

5

Sie sollten nto die DbContext Klasse als Modell direkt in View werden. Ihre Controller-Aktion sollte dafür verantwortlich sein, die Daten aus der Datenbank mithilfe von DbContext abzurufen und an View zu übergeben. Die Art und Weise, wie Sie vorgehen, bietet nicht die Vorteile des Model View Controller-Musters, stattdessen missbrauchen Sie das MVC-Muster. Die Ansicht sollte nur wissen, welche Art von Modell es von Controller erhalten würde, gerade jetzt ist das Abrufen von Code aus Ihrer Sicht nicht der richtige Ansatz.

Sie getan haben einige Dinge falsch, vor allem Ihre Modell-Deklaration in der Ansicht sollte List<MonLivredor.Models.Commentaire>, sein, so dass sich ändern:

@model List<MonLivredor.Models.Commentaire> 
<h1>Commentaires</h1> 

<tr> 
@foreach (var com in Model) 
{ 
    <td> 
     <a href="mailto:com.Mail">@com.Nom @com.date</a> 
     <p>@com.Message</p> 
    </td> 

} 

und dann in Ihrer Aktion gibt es viele Fragen , müssen Sie die Ergebnisse Form Datenbank abfragen und wenn kein Ergebnis gibt, dann ist afteradding die 2 Elemente, können Sie das Ergebnis wieder aus der Datenbank abfragen:

public ActionResult Commentaire() 
{ 
    IQueryable<Commentaire> result = context.Liste; 
    if (!result.Any()) 
    { 

     context.Liste.Add(new Commentaire("Jacky", "[email protected]", "Bonjour je m'apelle Jacky et j'aime le C#")); 
     context.Liste.Add(new Commentaire("Bobby", "[email protected]", "Bonjour je m'apelle Bobby et je deteste le Java")); 
     context.SaveChanges(); 

    } 

    return View(result.ToList()); 
} 

Sie müssen auch Ihre Modellbauer ändern:

public Commentaire(int id,String nom, String mail, String message) 
{ 
    date = DateTime.Now; 
    this.Nom = nom; 
    this.Mail = mail; 
    this.Message = message; 
    ID = id; 
} 

und den ID-Wert von der Steuerung oder eine andere Option übergeben, die mehr besser ist, ist die ID Spaltenwert von Datenbank automatisch generiert zu machen, die die Verwendung von getan werden kann, @bilpor Antwort, aber nach dem Aktualisieren des Modells müssen Sie die Migration ausführen, um die Tabelle mit neuen Änderungen zu aktualisieren.

+0

Ok, ich habe es geschafft, ich habe immer noch die ungültige Spalten-ID, aber jetzt zeige ich wieder auf View (result.ToList()); –

+0

können Sie die Fehlerdetails hinzufügen, es sieht aus wie der Fehler beim Einfügen von Zeilen kommt –

+0

Woops scheint, fügte ich in den falschen Abschnitt ... –

0

unter [key] auf Ihrem Modell fügen Sie Folgendes hinzu.

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

und entfernen Sie die Zeile, wo Sie versuchen, es zu setzen. Dies sollte das Problem lösen

+0

Ok danke, das habe ich aber trotzdem geschafft. Ich bin wandern, wenn meine Tischkommentare ist nicht das Problem in: [Tabelle ('Kommentare)] –

+0

, die nicht ein Problem sein sollte, aber bilpor zeigt in die richtige Richtung, Sie nicht ID selbst zuweisen beim Erstellen von 'Commentaire' Objekte, die Sie einfügen möchten, so dass es fehlschlagen würde, wie Sie im Modell nicht erwähnt haben, dass es automatisch generiert würde, so dass –

+0

die Deklaration von "public int i = 0;" muss entfernt werden, und die Zeile darüber, in der Sie das Datum deklarieren, muss ein '{get; set;}' hinzugefügt werden. Dies ist, was die Tabelle in der Datenbank erstellt und in die geschrieben werden muss. – bilpor

Verwandte Themen