[英]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()时,可以检查YourObject
的Type
。 您可以在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.