繁体   English   中英

C#MVC 4-从单个控制器动作动态调用模型

[英]C# MVC 4 - Dynamically calling models from a single controller action

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

private ModelEntities db = new ModelEntities();

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

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

如讨论的那样,实现一个接口(例如IDynamicTable)并使用映射文件执行数据操作(例如Delete)?

示例:调用YourObject.Delete()时,可以检查YourObjectType 您可以在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。

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

如果您具有一对多的必需关系,则可以执行此操作以使对象执行级联删除。 您可以在模型中的所需关系上添加[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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM