Жаңа жазбаларды сақтаған кезде үлгінің [Кілт] сипатын орнату мүмкін емес

Мәселен, мен MVC3-ге көшіп кеттім, және тұтастай алғанда бұл керемет деп ойлаймын; Маған өте ұнайды codefirst көзқарас.

Мен бүгін аздап алаңдадық, ал MVC2 астында жазбаларды қосып, редакциялай алдым, енді мен мұны істей алмаймын.

Мен бұл белгісіз бастама екенін білемін.

Міне, менің үлгілерімнің бір мысалы

namespace ESF_ResourceManager.Models
{
    public class FileList
    {
        [Key]
        public int FileListID { get; set; }

        [DisplayName("File title: ")]
        [Required(ErrorMessage = "Please set a unique title for the file")]
       //TODO: Need to add remote validation - must be unique
        public string FileTitle { get; set; }

        [DisplayName("Choose a File")]
        [FileExtensions(Extensions = "txt, zip, pdf, ppt, xls, doc, docx, xlsx, pptx", ErrorMessage = "Please choose a valid file of type txt, zip, pdf, ppt, xls, doc, docx, xlsx or pptx")]
        public HttpPostedFileBase FileUrl { get; set; }

    }
}

Содан кейін тиісті контроллер:

namespace ESF_ResourceManager.Controllers
{
    public class FileListController : ResourceManagerController
    {
        //
       //GET: /FileList/

        public ActionResult Index()
        {
            var fileList = from fl in DBContext.FileLists
                           where fl.FileListID > 0
                           select fl;

            return View(fileList.ToList());
        }


        //
       //GET: /FileList/Create
        [HttpGet]
        public ActionResult Create()
        {
            return View();
        }

        //
       //POST: /FileList/Create

        [HttpPost]
        public ActionResult Create(FileList fileDetail)
        {
            if (ModelState.IsValid)
            {
               //test the file - size only - the file type should have been checked via Extensions as par tof the model definition
                if (fileDetail.FileUrl.ContentLength > 0 && fileDetail.FileUrl.ContentLength < 1048576)
                {
                    string fileName = Path.GetFileName(fileDetail.FileUrl.FileName);
                    string path = Path.Combine(Server.MapPath("~/App_Data/uploads/documents"), fileName);
                    fileDetail.FileUrl.SaveAs(path);

                    DBContext.FileLists.Add(fileDetail);
                    DBContext.SaveChanges();
                    return RedirectToAction("Index");

                }
            }

            return View(fileDetail);
        }

        //
       //GET: /FileList/Edit/5
        [HttpGet]
        public ActionResult Edit(int id)
        {
            var fileDetail = from fl in DBContext.FileLists
                             where fl.FileListID == id
                             select fl;
            return View(fileDetail.Single());
        }

        //
       //POST: /FileList/Edit/5

        [HttpPost]
        public ActionResult Edit(int id, FileList fileDetail)
        {

            if (ModelState.IsValid)
            {
                var fileEdited = DBContext.FileLists.Find(id);
                UpdateModel(fileEdited);
                DBContext.SaveChanges();
                return RedirectToAction("Index");
            }

            return View();

        }

        //
       //GET: /FileList/Delete/5

        public ActionResult Delete(int id)
        {
            var fileDetail = from fl in DBContext.FileLists
                             where fl.FileListID == id
                             select fl;
            return View(fileDetail.Single());
        }

        //
       //POST: /FileList/Delete/5

        [HttpPost]
        public ActionResult Delete(int id, FileList fileDetail)
        {
            try
            {
                DBContext.FileLists.Remove(DBContext.FileLists.Find(id));
                DBContext.SaveChanges();
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
    }
}

Разор болып табылатын көрініс (жасау үшін):

@model ESF_ResourceManager.Models.FileList

@{
    ViewBag.Title = "File List";
    Layout = "~/Views/Shared/_Layout.cshtml";
}


    @using (Html.BeginForm("Create", "FileList", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        @Html.ValidationSummary(true)
        
File List <div class="editor-label"> @Html.LabelFor(model => model.FileTitle) </div> <div class="editor-field"> @Html.EditorFor(model => model.FileTitle) @Html.ValidationMessageFor(model => model.FileTitle) </div> <div class="editor-label"> @Html.LabelFor(model => model.FileUrl) </div> <div class="editor-field"> @Html.TextBoxFor(model => model.FileUrl, new { type = "file" }) @Html.ValidationMessageFor(model => model.FileUrl) </div>

<input type="submit" value="Create" />

    }

    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>

Мәселен, мен көріністі қотарып, деректерді енгізу үшін пішінді көре аламын, бірақ Мен Жасау түймешігін басқанда, мына хабарды аламын:

Мән нөлге тең болмайды. Параметр атауы: пернесі

Мен объектіге отладчике қарадым және объектіні құрудан кейінгі ештеңе табылмады. кілт 0 болса, мен бұны 1 деп күтетін едім (мүмкін дұрыс емес).

Мәселен менің алғашқы сұрағым - мұнда неге сағынамын? Маған бұл үшін дұрыс жұмыс істеу үшін не істеу керек?

Екінші мәселе жалпы болып табылады - менің деректерім қайда? Бұл туралы оқып отырған оқулықтар SQLExpress дерекқорының немесе App_Data бағдарламасында SqlCE немесе SQLCE дерекқорын жасағанын білдіреді. Олардың ешқайсысын таба алмаймын, сондықтан мен қай жерде екенімді білмеймін.

Бұл туралы кез келген көмек өте бағаланады.

Көп рақмет nathj07

ӨҢДЕУ

Тоқтатқаныңыз үшін рахмет, мен әлі де сұрақтар қойғанда пайдалы болатынын білемін. Міне, сұралған элементтер:

Деректер контексті

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;

namespace ESF_ResourceManager.Models
{
    public class ResourceManagerContext : DbContext
    {
        public DbSet Resources { get; set; }
        public DbSet ResourceTypes { get; set; }
        public DbSet Users { get; set; }
        public DbSet FileLists { get; set; }
    }
}

Web.Config

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=152368
  -->


  
    
    
    
  

  
    
      
        
        
        
        
        
      
    

    
      <forms loginUrl="~/Account/LogOn" timeout="2880" />
    

    
      
        
        
        
        
        
        
      
    
  

  
    
    
  

  
    
      
        
        
      
    
  

Және соңында -

Көріністер/Web.config

<?xml version="1.0"?>


  
    
      
      
    
  

  
    
    
      
        
        
        
        
      
    
  

  
    
  

  
    
      
    

    <!--
        Enabling request validation in view pages would cause validation to occur
        after the input has already been processed by the controller. By default
        MVC performs request validation before a controller processes the input.
        To change this behavior apply the ValidateInputAttribute to a
        controller or action.
    -->
    
      
        
      
    
  

  
    

    
      
      
    
  

Егер сізде тағы бір нәрсе бар болса, онда оны көруге қуаныштымын.

Рахмет nathj07

Edit 2 I have now tried adding a SQLExpress database manually and updating the connection string in the web.config file.

 
    
    
  

Бұл мені сол қателіктермен қалдырады - ешқандай айырмашылық жоқ. Мен бұған толықтай зиян келтіремін және қайда баруға болатынын білмеймін. Бұл туралы қосымша ұсыныстар бар ма?

Рахмет nathj07

1
тағы екі нәрсе қажет болуы мүмкін: 1) егер сіздің қосылым жолын айқын көрсеңіз, databasecontext сыныбы мен web.config
қосылды автор ashutosh raina, көзі
Қазір неліктен проблема бар? Жоғарыда айтылған ерекшелік (мен жай ғана хабарды атап көрсеттім)? Немесе дерекқорды таба алмайсыз ба?
қосылды автор Slauma, көзі
Дерекқордың жасалғанын «қалай болжай» аласыз? ДБ-ның бар-жоғын тексере алмайсыз ба? Егер ешқандай қосылым жолын көрсетпесеңіз, ол SQL Server Express DB болады (төменде жауапты қараңыз). Дерекқор - сіздің ерекше жағдайыңыздың себебін анықтау үшін біріншіден керек нәрсе.
қосылды автор Slauma, көзі
Мәселе басқаша емес. Негізінен, мен бұл жұмыстарды қалпына келтірдім. Жобада 4 модель - ресурс түрлері, ресурс, пайдаланушылар және файлдар тізімі бар. Барлық файл тізімін қайта жасай отырып, бәрі жақсы жұмыс істейтінін байқадым. Мен filelist үлгісін көрсетілгендей қосып, қатені аламын. Бұл жолы қосылым жолдары жоқ және мен болжауымша (жаман білемін), бұл SQL серверінің біреуін SQLServerExpress немесе CE-да жасаған. Мен қазірдің өзінде бірнеше басқа сұрақтармен қалдым, бірақ мен оларды жаңа ағындарға жіберемін. Барлық көмегіңізге рахмет. Мен сәйкесінше nathj07 деп ойлаймын
қосылды автор nathj07, көзі
Hi Slauma, мен толық келісемін. Бізге db қалай табуға болатынын білмеймін. Sql басқару экспрессі байланысу үшін ештеңе таба алмайды. Мұны қалай табуға болатыны туралы кез-келген идеялар?
қосылды автор nathj07, көзі
Сәлеметсіз бе, мен оны сұрыптап алдым. SQLServer экспресс-дерекқорына қосылу туралы менің түсінігімде бірдеңе болмады. Қалай болғанда да, енді мен ДБ-ны таба аламын және сол жерде не болып жатқанын көремін. Барлық көмекке рахмет.
қосылды автор nathj07, көзі

3 жауаптар

It seems that EF doesn't mark your key as an identity column. Entity Framework marks a property as a primary key if the type is int, short or long, and the name is Id. On your model, the 'ID' part is in upper case. You have two possible solutions:

  • [DatabaseGeneratedOption.Identity]]
  • FileListId -ден FileListId -дан меншікіңізді қайта атаңыз.

Бірінші шешімге барсаңыз, сіздің меншікіңіз келесідей болады:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int FileListID { get; set; }
1
қосылды
Бастапқы немесе Шетелді анықтау әдісі регистрді ескермейді, сондықтан ID және Id де жақсы.
қосылды автор Slauma, көзі
Slauma, бұл түсініктеме үшін рақмет. Үлкен идентификатормен жұмыс істейтін демонстрациялық шешімі болғандықтан, бұл жағдайға сезімтал емес деп ойладым.
қосылды автор nathj07, көзі
Jesse, [DatabaseGenerated] аннотациясын орнатқан кездегі кеңестерге рақмет, ол маған жаңа нәрсені үйретті.
қосылды автор nathj07, көзі

Сіздің екінші сұрағыңыз:

Сіздің web.config файлыңызда қандай да бір байланыс жолы болмағандықтан Entity Framework 4.1 деректер базасы болмаса, SQL Server Express данасында жаңа дерекқорды жасауға тырысады. Бұл дерекқордың атауы Namespace.DerivedContextName болып табылады, сондықтан сіздің жағдайда: ESF_ResourceManager.Models.ResourceManagerContext болуы керек.

Сервер жетектеушісі арқылы SQL Server Management Studio немесе Visual Studio бағдарламасымен дерекқорды қарап шығуға болады.

Сіздің бірінші сұрағыңыз:

Сіздің қателігіңізді алып тастаудың ықтимал себебі - сіздің үлгіңіздегі FileListID негізгі сипатына сәйкес келетін дерекқордағы негізгі баған сәйкестендіру бағаны ретінде белгіленбейді, яғни автоматты түрде өз мәнін жасайтын баған ретінде жаңа жолды енгізген кезде. Модель теңшелімі бағанның жеке екендігін болжайды (әдепкі бойынша, сіз оны өшірмегенсіз). Нәтижесінде, EF жаңа дерекқорды кірістірген кезде дерекқорға FileListID үшін мәнді жібермейді, себебі ол дерекқордың мән жасайтынын болжайды. Егер дерекқордағы баған жеке тұлға болмаса, ол мән жасамайды және сіз ерекшелік аласыз.

Осылайша, егер сіз FileListID - жеке куәлік болса, DB-ге тіркелуіңіз керек, егер болмаса, оны қосыңыз.

0
қосылды

Mvc жасау үшін, FileListID-ті қосыңыз

@Html.HiddenFor(model => model.FileListID)
0
қосылды
Сәлеметсіз бе, Фернандо, мен бұрын-соңды көрінетін өрісті қосуға тырыстым, бұл ешқандай айырмашылық жоқ. Мен жұмысқа шыққан кезде жасырын даланы көремін. Nathj07 алғыс
қосылды автор nathj07, көзі
Сәлеметсіз бе, Фернандо - бұл коды тамшыдан болды, сондықтан мен оны үйден сынап, жұмыс істемедім. Басқа жауаптарыңыз бар ма? Мен бастапқы сұраққа бірнеше кодты қостым. Көмектесуге тағы да рахмет.
қосылды автор nathj07, көзі