代码优先 - 更新单个属性

时间:2013-01-25 21:42:24

标签: asp.net-mvc-4 ef-code-first entity-framework-5

我们正在使用EF5,Code First方法来构建我们正在构建的MVC4应用程序。我们正在尝试更新实体上的1个属性,但不断出现错误。以下是上下文创建的类:

public partial class Room
{
    public Room()
    {
        this.Address = new HashSet<Address>();
    }

    public int RoomID { get; set; }
    public Nullable<int> AddressID { get; set; }
    public Nullable<int> ProductVersionID { get; set; }
    public string PhoneNumber { get; set; }
    public string AltPhone { get; set; }
    public string RoomName { get; set; }
    public string Description { get; set; }
    public string Comments { get; set; }
    public string Notes { get; set; }

    public virtual ICollection<Address> Address { get; set; }
}

以下是视图的ViewModel:

public class RoomDetailsViewModel
{
    //public int RoomID { get; set; }
    public string RoomName { get; set; }
    public string PhoneNumber { get; set; }
    public string AltPhone { get; set; }
    public string Notes { get; set; }
    public string StateCode { get; set; }
    public string CountryName { get; set; }
    public string ProductVersion { get; set; }
    public int PVersionID { get; set; }
    public List<SelectListItem> ProductVersions { get; set; }
    public Room Room { get; set; }
}

这是在“保存”上调用的控制器动作:

    [HttpPost]
    public virtual ActionResult UpdateRoom(RoomDetailsViewModel model)
    {
        var db = new DBContext();

        bool b = ModelState.IsValid;

        var rooms = db.Rooms;
        var rm = rooms.Where(r => r.RoomID == model.Room.RoomID).Single();
        //List<Address> address = db.Addresses.Where(a => a.AddressID == rm.AddressID).ToList<Address>();

        rm.ProductVersionID = model.PVersionID;
        //rm.Address = address;

        db.Entry(rm).Property(r => r.ProductVersionID).IsModified = true;

        //db.Entry(rm).State = System.Data.EntityState.Modified;

        db.SaveChanges();

        return View("RoomSaved", model);
    }

所有这些视图都是显示数据并允许用户更改产品版本(来自SelectList),因此,在Room Entity中,我们正在更新的是ProductVersionID属性,没有别的。我们可以正确显示数据但是当我们点击“保存”时,我们会收到此错误:

  

'System.Collections.Generic.List`1 [[Models.Address,   Web.Mobile.TestSite,Version = 1.0.0.0,Culture = neutral,   无法在Value中设置或删除PublicKeyToken = null]]'   “Models.Address”类型的EntityReference的属性。

正如您可以通过Controller Action看到的那样,我们尝试了几种不同的东西,但似乎都产生了这个错误。我试图使用Address填充model.Room.Address集合,但是仍然会收到此错误。

我看过this StackOverflow articlethis article as well,但都没有解决我的问题。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

经过数小时和数小时的挖掘,结果发现EF 导入了我的数据库表的一些PK。让我知道的是Room类,PK RoomID上没有[Key]属性。我试图通过edmx重新导入表格,但它从来没有作为一个键出现(即使它在数据库中清楚地标记为PK)。因此,为了解决这个问题,我创建了一个DBContext的部分类并覆盖了OnModelCreating事件并包含了密钥,如下所示:

public partial class DBContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Entity<Models.Room>().HasEntitySetName("Rooms");
        modelBuilder.Entity<Models.Room>().HasKey(r => r.RoomID);
    }
}

一旦完成,Action就按照希望保存了记录。

我希望这有助于其他人!