简体   繁体   中英

Invalid Column Name C#

I'm quite new to C# and Visual Studio MVC and am working on a simple project where I need to implement a page of comments that can be posted through a form (which I haven't implemented yet). Here's my problem, I keep getting 'Invalid Column ID' error. I've been looking up all the answers on the web but haven't found anything that corrected my problem. I come from Java so some concepts are not really apparent to me, especially since I started yesterday.

Here's my Context:

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);
       }
   }
}

And Here's my 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", "Jacky@gmail.com", "Bonjour je m'apelle Jacky et j'aime le C#");
        Commentaire com2 = new Commentaire("Bobby", "Bobby@gmail.com", "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);
        }
    }

Model:

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;
    }


}
}

In my view I just want to be able to see the messages:

@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>

Sorry for the messy code, I've been tearing my hair out with this, and the answer is probably silly. When I get the error, I get redirected to the view page on the line:

@foreach (var com in Model.Liste)

with the error 'invalid column name ID'.

Stack trace:

[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

Thanks for your help

You should nto be using the DbContext class as your model directly in View. Your controller action should be responsible to get the data from the database using DbContext and pass it to View. The way you are doing would not provide the benefits of Model View Controller pattern, but instead you are abusing the MVC pattern. The View should only be knowing what type of Model it would be receiving from controller, right now data fetching code is in your view that is not the right approach.

You have done couple of things wrong, first of all your model declaration in the View should be List<MonLivredor.Models.Commentaire> , so change that to:

@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>

}

and then in your action there are many issues, you need to query results form database and if there is no result then afteradding the 2 items, you can query the result again from database :

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

        context.Liste.Add(new Commentaire("Jacky", "Jacky@gmail.com", "Bonjour je m'apelle Jacky et j'aime le C#"));
        context.Liste.Add(new Commentaire("Bobby", "Bobby@gmail.com", "Bonjour je m'apelle Bobby et je deteste le Java"));
        context.SaveChanges();

    }

    return View(result.ToList());
}

You also need to change your model constructor to be :

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

and pass the ID value from the controller or another option which is more better is to make the ID column value autogenerated by database which can be done using the @bilpor answer, but after updating model you will have to run the migration to update the table with new changes.

under [key] on your model add the following.

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

and remove the line where you are trying to set it. This should solve the issue

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM