Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 为什么会抛出空值异常?_Asp.net Mvc 3_Entity Framework 4_Objectcontext_Objectset - Fatal编程技术网

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(公文包)
to
db.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中自动生成的。