Asp.net mvc 3 为什么会抛出空值异常?
由于某种原因,我在Asp.net mvc 3 为什么会抛出空值异常?,asp.net-mvc-3,entity-framework-4,objectcontext,objectset,Asp.net Mvc 3,Entity Framework 4,Objectcontext,Objectset,由于某种原因,我在db.SaveChanges()中遇到以下错误:说明: Cannot insert the value NULL into column 'UserId', table 'XXXXXXXXX_Dev.dbo.Portfolios'; column does not allow nulls. INSERT fails. The statement has been terminated. 控制器代码: [HttpPost] [Authorize] public ActionR
db.SaveChanges()中遇到以下错误:代码>说明:
Cannot insert the value NULL into column 'UserId', table 'XXXXXXXXX_Dev.dbo.Portfolios'; column does not allow nulls. INSERT fails.
The statement has been terminated.
控制器代码:
[HttpPost]
[Authorize]
public ActionResult Create(Portfolio portfolio)
{
if (ModelState.IsValid)
{
portfolio.UserId = (Guid)Membership.GetUser().ProviderUserKey;
db.AddToPortfolios(portfolio);
db.SaveChanges();
}
return View("MyPortfolios");
}
我已通过调试器并确认正在填充UserID
更新:
我尝试过更改db.AddToPortfolios(公文包)
todb.portfolions.AddObject(公文包)代码>但它仍然存在相同的问题
portfolions
是一个ObjectSet
,我应该使用Attach()
方法吗?我只从一种情况知道这个异常,也就是说:UserId
不是数据库中的标识列,但在EF模型中,相应的属性被标记为这样的属性-这意味着它可以通过DatabaseGeneratedOption.identity显式地属性化,也可以通过约定隐式地属性化
问题是在这种情况下,EF不会将属性值发送到Db(无论是否设置),因为它假定Db将执行创建列值的工作。但是Db没有,因此例外
只是猜测而已
编辑:
要解决此问题,您必须使用DatabaseGeneratedOption标记UserId
。None
是另一个表的外键,还是Portfolio
表上的主键(或者可能是一对一关系中的两个)?你真的使用EF4.1吗?我很好奇,因为在你的代码中,db
似乎是ObjectContext
而不是DbContext
。你是对的,我使用的是版本4而不是4.1。我使用模型优先的方法来创建数据库UserId
是Portfolio
的主键<代码>投资组合
与另一个表存在多对多关系。看起来实体框架在实际数据库中创建了一个联接表,以方便多对多。UserId设置为DatabaseGeneratedOption.Identity
。我是否应该将此更改为其他内容?相应的db列是UserId(PK,uniqueidentifier,notnull)
@zeroddivide:Yes,DatabaseGeneratedOption。无是解决方案<代码>唯一标识符
/guid列不是在SQL Server中自动生成的。