我使用Visual Studio在 ASP.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 KARLODocumentsVisual Studio 2012ProjectsFINALFINALControllersHomeController.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(
连接字符串(感谢奥列格):
<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="data source=|DataDirectory|DB.sdf"" 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="data source=|DataDirectory|DB.sdf"" 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="data source=|DataDirectory|DB.sdf"" 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="data source=|DataDirectory|DB.sdf"" 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; }
}
}
您收到此异常是因为某些Model
属性具有null
值。但在检查之前,我建议您在模型中创建一个key
列,它不应该Nullable
。当您添加新的object
model
值时,应在调用SaveChanges
之前设置key
列的值。
你的键列应该是这样的
[Key]
public int Id { get; set; }
如果您不想在添加新object
时手动设置此key
列的值,则可以将其设置为标识列,以便自动插入其值,因此您必须将[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
添加到key
列中。
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
并确保在添加新object
时,所有属性都具有该值,否则将获得相同的异常。
问题会导致 EF 中的此错误消息。
据我所知,实体框架依赖于具有一些唯一标识符的对象。拥有一个最简单的方法是您拥有的 ID,但您不应该将其设置为空。它应为 int 类型,并且此列的 SQL Server 应将标识设置为 true。
如果这不是您的问题,请在调用 SaveChanges 之前调试并检查哪些值已设置,更重要的是哪些值仍为 null。
如果您删除Bind(Exclude = "Id")
属性,它是否有效?
这似乎是罪魁祸首。看起来您是在DomainModel而不是ViewModel上使用它。您尝试在事后设置它,但属性已设置。
有几种方法可以解决这个问题。
-
创建一个仅具有您希望可编辑的属性的 ViewModel,然后将其传回并映射到您的 DomainModel。
-
让您的数据库处理自动增量
-
只需删除
Bind(Exclude = "Id")
属性,不要公开该属性(如上所示)
您最终尝试在没有标识符的情况下插入。
你可以在这里看到这个答案,里面有更详细的信息:[绑定(排除="Id")]的替代项