MVC3继承问题

时间:2012-06-02 20:09:04

标签: asp.net-mvc asp.net-mvc-3 visual-studio-2010 entity-framework entity-framework-4

我有一个包含以下表格的数据库

  • 商业(包含所有常见字段)
  • Business_Hotel(包含特定于酒店的字段)
  • Business_Restaraunt(包含特定于Restaraunts的字段)
  • Business_Airport(包含特定于机场的字段)

我使用继承在EF中建模这些。

  • 企业(基地)
  • 酒店(继承商家)
  • Restaraunts(继承商家)
  • 机场(继承商家)

我使用基本实体(业务)

在VS2010中使用Controller创建向导创建了控制器

我想对所有三种类型重复使用相同的Create操作。

 [HttpPost]
 public ActionResult CreateHotel(Business business)
    {


        if (ModelState.IsValid)
        {


            db.Businesses.AddObject(business);        
            db.SaveChanges();
            return RedirectToAction("Index");
        }

如果我按照下图所示修改功能,它会正确创建一个类型为“商务”的商家

 public ActionResult CreateHotel(Hotels business)

所以问题是我该如何动态地做到这一点。有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

作为建议,最好不要尝试重复使用单个Action(即使DRY原则看起来很吸引人)

即使你能找到办法,将来这也很难维持。

您要做的是:

将商务酒店,商务餐厅以及任何商务酒店视为商务酒店。你看到了什么问题吗?酒店应该有自己的商业规则,机场和餐厅也是如此

如果您将来尝试为每一个添加一些特定的逻辑,您的操作方法会增加复杂性(BTW操作方法应该只调用模型以保持它们清洁)。

这在蓝皮书(DDD)

中有更好的描述

所以我的建议是不要重复使用这种逻辑(域逻辑),我个人尝试只重用基础架构逻辑

答案 1 :(得分:1)

实现它的几种方法。但是,自动生成的模型无济于事。

  1. 利用经典构建器设计模式。定义一个viewmodel,它可以捕获所有三个模型的数据,Hotels,Restaraunts,Airports。在视图模型中,保留像“BusinessType”等的区分符和通过查看类型来创建适当的业务对象的函数。需要静态或动态地在UI中设置区分符。

    public class BusinessViewModel 
    {
    
      // all attributes go here.
      public int BusinessType { get; set; }
    
      public Businesses CreateBusinessObject()
      {
        if(BusinessType == "1")
            //Create and return a new Hotel
      }
    }
    
  2. 在控制器中,它将像这样使用:

        [HttpPost]
         public ActionResult CreateHotel(BusinessViewModel businessVM)
        {
    
    
            if (ModelState.IsValid)
           {
                Businessess business = businessVM.CreateBusinessObject()
    
            db.Businesses.AddObject(business);        
            db.SaveChanges();
            return RedirectToAction("Index");
           }
    

    2.在控制器中的操作方法中直接将表单集合作为输入,而不是模型/视图模型,然后解析它并创建适当的对象。