Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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 Net MVC 5-类型';布尔';必须是引用类型才能将其用作参数_Asp.net Mvc_Entity Framework_Asp.net Mvc 5 - Fatal编程技术网

Asp.net mvc Net MVC 5-类型';布尔';必须是引用类型才能将其用作参数

Asp.net mvc Net MVC 5-类型';布尔';必须是引用类型才能将其用作参数,asp.net-mvc,entity-framework,asp.net-mvc-5,Asp.net Mvc,Entity Framework,Asp.net Mvc 5,我正在主页上显示公告。从数据库中获取公告时,我检查它们是否处于活动状态。若并没有,我不会显示在主页上,而是将它们保存在数据库中。当我试图将公告设置为非活动时,我在调试程序之前收到了这个错误 Error 5 The type 'bool' must be a reference type in order to use it as parameter 'TEntity' in the generic type or method 'System.Data.Entity.DbContex

我正在主页上显示公告。从数据库中获取公告时,我检查它们是否处于活动状态。若并没有,我不会显示在主页上,而是将它们保存在数据库中。当我试图将公告设置为非活动时,我在调试程序之前收到了这个错误

  Error 5   The type 'bool' must be a reference type in order to use it as
  parameter 'TEntity' in the generic type or method 'System.Data.Entity.DbContext
  .Entry<TEntity>(TEntity)'
这是我的模型

public class Duyuru
{
    public int ID { get; set; }
    public string Message { get; set; }
    public string Title { get; set; }
    public bool Active { get; set; }
    public DateTime UploadDate { get; set; }
}
如果我这样做的话

public ActionResult Edit([Bind(Include = "ID,Message,Title,Active")] Duyuru duyuru)
    {
        if (ModelState.IsValid)
        {
            duyuru.UploadDate = db.Duyuru.Find(duyuru.ID).UploadDate;
            db.Entry(duyuru).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(duyuru);
    }
我得到这个错误

 Attaching an entity of type '...Models.Duyuru' failed because another entity
 of the same type already has the same primary key value. This can happen when
 using the 'Attach' method or setting the state of an entity to 'Unchanged' or
 'Modified' if any entities in the graph have conflicting key values. This may
 be because some entities are new and have not yet received database-generated key
 values. In this case use the 'Add' method or the 'Added' entity state to track
 the graph and then set the state of non-new entities to 'Unchanged' or 'Modified' as       appropriate.

你只需要这样做

db.Entry(duyuru).State = EntityState.Modified;
var duyuruDb = db.Duyuru.Find(duyuru.ID);
duyuruDb.Message = duyuru.Message;
duyuruDb.Title= duyuru.Title;
duyuruDb.Active = duyuru.Active;
db.SaveChanges();
然后,所有属性都将根据密钥进行更新

更新 而不是这个

duyuru.UploadDate = db.Duyuru.Find(duyuru.ID).UploadDate;
db.Entry(duyuru).State = EntityState.Modified;
db.SaveChanges();
你可能想这样做

db.Entry(duyuru).State = EntityState.Modified;
var duyuruDb = db.Duyuru.Find(duyuru.ID);
duyuruDb.Message = duyuru.Message;
duyuruDb.Title= duyuru.Title;
duyuruDb.Active = duyuru.Active;
db.SaveChanges();

你不该这么叫那个人。您应该将实体对象传递给它,而不是它的一个属性。由于实体框架要求这些实体对象是类,所以如果要传递的属性是值类型,则在编译时会失败

db.Entry(duyuru)
是调用
Entry
方法的有效方法

针对您的评论:

这会失败,因为
db.Duyuru.Find(Duyuru.ID)
返回附加到
db
的实体
duyuru
不能附加到相同的
db
上下文

您可以直接更新返回的实体:

var entity = db.Duyuru.Find(duyuru.ID);
entity.Title = duyuru.Title;
// same for other properties
db.SaveChanges();

可以使用原始方法,但将
State
设置为
EntityState.Modified
始终将所有属性标记为已修改。然后,您可以检索属性条目(
var entry=db.entry(duyuru);
,然后访问
entry.property(propertyName)
),并设置为
false
,以指定不修改
UploadDate
。或者,您可以先将实体附加为“未更改”,并将要保存的属性显式设置为“已修改”。

我将按如下方式进行部分更新:

public ActionResult Edit(Duyuru duyuru)
    {
        if (ModelState.IsValid)
        { 
                db.Duyuru.Attach(duyuru); 
                db.Entry(duyuru).Property("Message").IsModified = true;
                db.SaveChanges();
         }

}

如果这样做,我会遇到另一个错误,因为我不想更新UploadDate。此外,它还可以与其他属性(如duyuru.Title或duyuru.Message)配合使用,但会在duyuru.Active处出现错误。我更新了我的问题,你可以看到error@CanTunç不,它不能很好地处理其他属性,它只会在运行时而不是编译时失败。@CanTunç希望接受实体,而不是每个属性,也
它可以很好地处理其他属性,如duyuru。Title
并不意味着实体被更新到数据库中,如果您使用特殊规则处理分离的对象,例如,
UploadDate
不想更新,那么您需要首先检索对象,或者以某种方式保留在UIYup中更新的
UploadDate
的原始值,即使在编译时它还可以,如果您传递的对象不是上下文的一部分,运行时将抛出错误,例如
实体类型字符串不是当前上下文的模型的一部分。
如果这样做,我会收到另一个错误,因为我不想更新UploadDate。此外,它还可以与其他属性(如duyuru.Title或duyuru.Message)配合使用,但会在duyuru.Active处出现错误。我更新了我的问题,你可以看到错误