SaveChanges在我的所有项目中都不起作用?

时间:2015-06-11 22:52:53

标签: c# asp.net asp.net-mvc entity-framework savechanges

我使用 Visual Studio ASP.NET MVC 项目上使用本地数据库。

我在修改数据库时遇到了问题。当我致电SaveChanges()时,我总是收到此错误:

  

该值不能为null参数名称:Source

以下是我如何修改数据库以及错误日志/ StackTrace的示例。

 [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult CreateMedico(Medico medicoToCreate)
    {
        List<Medico> dedo = data.Medico.ToList();
        if (ModelState.IsValid)
        {
            using (MedsEntities data = new MedsEntities())
            {
                medicoToCreate.Id = dedo.Count() + 1;
                data.Medico.Add(medicoToCreate);
  System.Diagnostics.Debug.WriteLine("RECURSO :" + medicoToCreate.RECURSO_MEDICO);
                    System.Diagnostics.Debug.WriteLine("NOMBRE: " + medicoToCreate.NOMBRE);
                    System.Diagnostics.Debug.WriteLine("TIPO: " + medicoToCreate.TIPO);
                // and so on with all properties.....
                System.Diagnostics.Debug.WriteLine("MEDICO A GRABAR:" + medicoToCreate.NOMBRE);
                if (medicoToCreate == null)
                {
                    System.Diagnostics.Debug.WriteLine("MEDICOTOCREATE, IS NULL");

                }
                else {
                    System.Diagnostics.Debug.WriteLine("MEDICOTOCREATE, IS NOT NULL");
                }
                data.SaveChanges();
                return RedirectToAction("MedicosList");
            }
        }

        return RedirectToAction("MedicosList");
    }

堆栈追踪:

   en System.Data.Entity.Internal.InternalContext.SaveChanges()
   en System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   en System.Data.Entity.DbContext.SaveChanges()
   en FINAL.Controllers.HomeController.CreateMedico(Medico medicoToCreate) en d:\IDEX8544 KARLO\Documents\Visual Studio 2012\Projects\FINAL\FINAL\Controllers\HomeController.cs:línea 70
   en lambda_method(Closure , ControllerBase , Object[] )
   en System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   en System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   en System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   en System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41()
   en System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _)
   en System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   en System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
   en System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33()
   en System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49(

连接字符串(感谢Oleg):

 <connectionStrings>
    <add name="MedsEntities" connectionString="metadata=res://*/Models.ModelMeds.csdl|res://*/Models.ModelMeds.ssdl|res://*/Models.ModelMeds.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;data source=|DataDirectory|\DB.sdf&quot;" providerName="System.Data.EntityClient" />
    <add name="HospitalEntities" connectionString="metadata=res://*/Models.ModelHosp.csdl|res://*/Models.ModelHosp.ssdl|res://*/Models.ModelHosp.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;data source=|DataDirectory|\DB.sdf&quot;" providerName="System.Data.EntityClient" />
    <add name="LabsEntities" connectionString="metadata=res://*/Models.ModelLabs.csdl|res://*/Models.ModelLabs.ssdl|res://*/Models.ModelLabs.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;data source=|DataDirectory|\DB.sdf&quot;" providerName="System.Data.EntityClient" />
    <add name="FarmaciasEntities" connectionString="metadata=res://*/Models.ModelFarms.csdl|res://*/Models.ModelFarms.ssdl|res://*/Models.ModelFarms.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;data source=|DataDirectory|\DB.sdf&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

MEDICO MODEL:

namespace FINAL.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Medico
    {
        public string RECURSO_MEDICO { get; set; }
        public string NOMBRE { get; set; }
        public string TIPO { get; set; }
        public string TIPO2 { get; set; }
        public string TIPO3 { get; set; }
        public string CELULAR { get; set; }
        public string EMAIL { get; set; }
        public string TEL1 { get; set; }
        public string TEL2 { get; set; }
        public string EXT { get; set; }
        public string HOSPITAL { get; set; }
        public string DIRECCION { get; set; }
        public string LAT { get; set; }
        public string LON { get; set; }
        public string C33DIGITOS { get; set; }
        [Key]
        public int Id { get; set; }
    }
}

数据库模型:

namespace FINAL.Models
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class MedsEntities : DbContext
    {
        public MedsEntities()
            : base("name=MedsEntities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public DbSet<Medico> Medico { get; set; }
    }
}

3 个答案:

答案 0 :(得分:2)

您收到此异常是因为某些Model属性的值为null。但在检查之前,我建议您在模型中创建key列,但不应该是Nullable。如果您在调用object之前添加了modelkey SaveChanges的{​​{1}}值。

你的键列应该是这样的

[Key]
public int Id { get; set; }

如果您不想在添加新key时手动设置此object列的值,则可以将其设置为标识列,以便为此自动插入其值,您必须添加[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]key

[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }

并确保在添加新object时,所有属性都具有该值,否则您将获得相同的异常。

答案 1 :(得分:1)

在EF中会出现各种导致此错误消息的问题。

据我记得,Entity Framework依赖于您的对象具有一些唯一标识符。 拥有一个的最简单方法是你拥有的Id,但你不应该让它可以为空。它应该是int类型,并且您的SQL Server应该将此列的标识设置为true。

如果这不是您的问题,请调试并检查在调用SaveChanges之前设置的值和更重要的值仍然为null。

答案 2 :(得分:1)

如果删除Bind(Exclude = "Id")属性,是否有效?

这似乎是罪魁祸首。看起来您在DomainModel而不是ViewModel上使用它。你试图在事后设置它,但是属性已经设置好了。

有几种解决方法。

  • 创建一个只有您希望可编辑的属性的ViewModel,然后将其传回并映射到您的DomainModel。

  • 让您的数据库处理自动增量

  • 只需删除Bind(Exclude = "Id")属性,不要公开该属性(如上所述)

你最终试图在没有标识符的情况下插入。

您可以在此处看到此答案,其中包含更多详细信息:Alternative for [Bind(Exclude = “Id”)]