【问题标题】:SaveChanges is not working in all my project?SaveChanges 不适用于我的所有项目?
【发布时间】:2015-06-11 22:52:53
【问题描述】:

我使用 Visual StudioASP.NET MVC 项目中处理本地数据库。

我在修改数据库时遇到问题。当我打电话给SaveChanges() 时,我总是收到这个错误:

值不能为空参数名称:来源

这是我如何修改数据库的示例,以及错误日志/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>

医学模型:

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

【问题讨论】:

  • 你能发布你的连接字符串吗?
  • 我很新在 MVC .NET 和数据库管理中,如果我使用本地数据库,我的连接字符串就是我调用它的地方(数据库)?
  • 看起来像这样 并且通常位于配置中
  • 并发布 Medico 和 MedsEntities 类的定义
  • 它是一个数据库模型,究竟是什么定义?或者你的意思是medicoToCreate??

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


【解决方案1】:

您收到此异常是因为您的某些 Model 属性具有 null 值。但在检查之前,我建议您在模型中创建一个key 列,它不应该是Nullable。当您添加新的object 时,应在调用SaveChanges 之前设置key 列的model 值。

你的键列应该是这样的

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

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

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

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

【讨论】:

  • 感谢您的回答,现在我在控制台中打印 MedicoTocreate 的所有属性,并且所有数据库都有 Id 属性(不允许空值),每次添加新条目时,我都会添加 @ 987654337@ 属性,但错误仍然存​​在!!!!谢谢。我会用我的新代码更新我的问题。
  • 我也做了一个身份增量,但什么也没做!
【解决方案2】:

有多种问题会导致 EF 中出现此错误消息。

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

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

【讨论】:

  • 如果不是您的 id,则调试并检查所有值。将被持久化到数据库的属性之一是否仍然为空?
  • 检查我的问题,我正在调试所有值并且它们都被正确打印。包括 ID
  • 您提供的是答案还是一般建议?你的观点很好,但似乎没有什么能接近解决方案。 “当心这个”和“试试那个”是合适的 cmets。
  • 我看到你打印到控制台,但结果不是。如果打印值,是否所有属性都有值?还是有些“空”?打印到控制台的 NULL 值也可能打印为空。这就是为什么设置断点并在本地检查对象可能会更好。有些东西必须是空的。
  • @DaveAlperovich 我试图给 OP 一个答案,因为他正在寻求帮助,为什么他会收到错误消息。错误消息是可能由多个问题引起的一般错误消息。这就是为什么我试图解释最有可能导致他的情况的 2 个原因。
【解决方案3】:

如果您删除您的Bind(Exclude = "Id") 属性,它会起作用吗?

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

有几种方法可以解决这个问题。

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

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

  • 只需删除 Bind(Exclude = "Id") 属性,不要暴露该属性(如上)

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

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

【讨论】:

  • 谢谢,我删除了Bind(Exclude = "Id") 标签,但什么也没发生,我仍然收到错误消息。谢谢。
  • 其他选项呢?你检查过调用堆栈吗?您应该能够监控它并查看正在生成的查询,这应该可以让您更深入地了解哪些部分不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
相关资源
最近更新 更多