我们正在使用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 article和this article as well,但都没有解决我的问题。
非常感谢任何帮助!
答案 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就按照希望保存了记录。
我希望这有助于其他人!