私の自称学習プロジェクトで、奇妙なエラーに出くわしました。
クラスがありますdevice
public class Device
{
[Key]
public int Id { get; set; }
[MaxLength(50)]
public String Name { get; set; }
public Category Category { get; set; }
/* .... */
}
とクラスCategory
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
}
ここで、データベースでカテゴリを直接削除しようとすると、外部キー制約がまだアクティブであるため、操作が失敗します。これは意図されたものであり、適切です。
ただし、私の Mvc ビューでは、この制約はアクティブではないようです。デバイス内でまだ使用されているかどうかに関係なく、すべてのカテゴリを削除できます。
これにより、カテゴリのないデバイスが生成されます。コントローラーで Edit メソッドを呼び出すと、viewmodel はすべてのカテゴリとデバイス カテゴリをselected
値として含む選択リストで満たされます。
var vm = new DeviceEditViewModel
{
dev = device,
CategoriesListItems = repo.GetCategories().Select(x => new SelectListItem
{
Value = x.ID.ToString(),
Text = x.Name,
Selected = x.Name == dev.Category.Name
}),
ManufactorListItems = repo.GetManufactors().Select(x => new SelectListItem
{
Value = x.ID.ToString(),
Text = x.Name,
Selected = x.Name == device.Manufactor.Name
})
};
return View(vm);
このコードは、カテゴリを指定せずにデバイスを呼び出すと、NullReferenceException をスローするようになりました。
カテゴリの削除アクションで制約チェックを強制するにはどうすればよいですか?また、データに一貫性がない場合、編集ビューのドロップダウンリストに選択した値が割り当てられないようにするにはどうすればよいですか?
制約チェックに関しては、これは私がこれまでに試したことですが、いいえ仕事。
//I still have to create a repository
public ActionResult DeleteConfirmed(int id)
{
Category category = db.Categories.Find(id);
int DevicesUsingCat = db.Devices.Include(o => o.Category)
.Where(d => d.Category.ID == id)
.Select(x => x).ToList().Count;
if (DevicesUsingCat > 0)
{
ModelState.AddModelError("Usage", "The category is still in use and cannot be deleted.");
return View(); //added. Now model error shows up.
}
db.Categories.Remove(category);
db.SaveChanges();
return RedirectToAction("Index");
}