0

我们正在对我们正在构建的 MVC4 应用程序使用 EF5,代码优先方法。我们正在尝试更新实体上的 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 中),因此,在房间实体中,我们要更新的只是 ProductVersionID 属性,仅此而已。我们可以让数据正确显示,但是当我们单击“保存”时,我们会收到以下错误:

'System.Collections.Generic.List`1[[Models.Address, Web.Mobile.TestSite, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'类型的对象不能从值中设置或删除“Models.Address”类型的 EntityReference 的属性。

正如您在控制器操作中看到的那样,我们尝试了几种不同的方法,但似乎都产生了这个错误。我试图用地址填充 model.Room.Address 集合,但仍然出现此错误。

我也阅读了这篇 StackOverflow 文章这篇文章,但都没有解决我的问题。

对此的任何帮助将不胜感激!

4

1 回答 1

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);
    }
}

完成此操作后,操作按希望保存了记录。

我希望这对其他人有帮助!

于 2013-01-26T01:57:35.393 回答