1

我有一个管理员控制器,需要从大约多个不同的模型中删除 UID。我可以通过传递字符串来选择模型吗?这是我想做的一个示例控制器操作(当然这不起作用):

private ModelEntities db = new ModelEntities();

public ActionResult ConfirmDelete(String ModelNameString, Int32 id)
{
    ModelNameString data = db.ModelNameString.Find(id);
    return View(data);
}

有没有其他方法可以将所有模型的标准任务组合成一个控制器动作?谢谢你。

4

2 回答 2

1

如前所述,实现一个接口(例如 IDynamicTable)并使用映射文件执行您的数据操作(例如删除)?

示例:当您调用 YourObject.Delete() 时,您可以检查Type您的YourObject. 你可以在你的Action

public ActionResult ConfirmDelete(IDynamicTable obj)
{
   // ...
   if (obj is Company)
   {
      // Delete in company table
      return View("Company");
   }
   if (obj is User)
   {
      // Delete in user table
      return View("User");
   }
   // ... 
}

不要忘记 ASP.Net MVC 不是 PHP+Zend。

于 2013-08-13T13:29:22.777 回答
0

如果您担心在删除主要引用后留下其他实体,您应该考虑进行级联删除。这意味着当您删除具有主键的主对象时,它将删除所有其他引用该主键的对象。

如果您有一对多所需的关系,您可以这样做以让您的对象执行级联删除。您可以[Required]在模型中的所需关系上添加一个属性,以便实体框架知道该关系是必需的,或者使用 Fluent API。

public class Product
{
    public Guid ProductId { get; set; }
    [Required]
    public Category Category { get; set; }
}

流畅的 API

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>().HasRequired(p => p.Category).WithMany();
}

如果您的关系是可选的,但您想要级联删除,您可以这样做:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>().HasOptional(p => p.Category).WithMany().WillCascadeOnDelete(true);
}
于 2013-08-07T13:51:12.240 回答