如何在Orchard中创建表关系?

时间:2012-11-16 11:02:27

标签: c# asp.net-mvc asp.net-mvc-3 model orchardcms

我希望MachineRecord包含GroupRecord Id,如下所示:

MachineRecord

标识
名称

GroupRecord

GroupRecord

标识
名称

我尝试过:

我试图让模型中的属性成为一个 public virtual GroupRecord GroupRecord { get; set; }
和数据库列名GroupRecord_Id,但不知何故不起作用,尝试了一些其他方式,如赋予属性名称GroupRecordId和表格列GroupRecord等等,但所有没有结果。

所以问题是,如何让它工作,以便MachineRecord表包含GroupRecord Id?

Machine.cs

namespace PowerAll.Voorraad.Models
{
  public class MachineRecord
  {
    public virtual int Id { get; set; }
    public virtual int MachineNumber { get; set; }
    public virtual string Title { get; set; }
    public virtual string Description1 { get; set; }
    public virtual string Description2 { get; set; }
    public virtual string Description3 { get; set; }
    public virtual string Description4 { get; set; }
    public virtual string Description5 { get; set; }
    public virtual string Description6 { get; set; }
    public virtual string SerialNumber { get; set; }
    public virtual GroupRecord GroupRecord { get; set; }
    public virtual char PriceType { get; set; }
    public virtual decimal Price { get; set; }
    public virtual int Year { get; set; }
  }
}

Group.cs

namespace PowerAll.Voorraad.Models
{
  public class GroupRecord
  {
    public virtual int Id { get; set; }
    public virtual string GroupName { get; set; }
  }
}

Migrations.cs

namespace PowerAll.Voorraad
{
  public class Migrations : DataMigrationImpl
  {
    public int Create()
    {
      SchemaBuilder.CreateTable("GroupRecord", table => table
        .Column<int>("Id", column => column.PrimaryKey().Identity())
        .Column<string>("GroupName", column => column.WithLength(100))
      );

      SchemaBuilder.CreateTable("MachineRecord", table => table
        .Column<int>("Id", column => column.PrimaryKey().Identity())
        .Column<int>("MachineNumber", column => column.NotNull())
        .Column<string>("Title", column => column.NotNull().WithLength(40))
        .Column<string>("Description1", column => column.WithLength(70))
        .Column<string>("Description2", column => column.WithLength(70))
        .Column<string>("Description3", column => column.WithLength(70))
        .Column<string>("Description4", column => column.WithLength(70))
        .Column<string>("Description5", column => column.WithLength(70))
        .Column<string>("Description6", column => column.WithLength(70))
        .Column<string>("SerialNumber", column => column.WithLength(20))
        .Column<int>("GroupRecord_id", column => column.NotNull())
        .Column<char>("PriceType", column => column.NotNull().WithLength(1))
        .Column<decimal>("Price", column => column.NotNull())
        .Column<int>("Year", column => column.WithLength(4))
      );

      // Return the version that this feature will be after this method completes
      return 1;
    }
  }
}

MachineController.cs

namespace PowerAll.Voorraad.Controllers
{
  [Themed]
  public class MachineController : Controller
  {
    private readonly IRepository<MachineRecord> machineRecords;

    public MachineController(IRepository<MachineRecord> MachineRecords) {
        machineRecords = MachineRecords;
    }

    public ActionResult List()
    {
        var items = machineRecords.Table;

        return View(items);
    }
  }
}

编辑2:

我感谢内啡肽,但是当我尝试执行AddDummyData()时,我收到了这个错误:could not insert: [PowerAll.Voorraad.Models.MachineRecord][SQL: INSERT INTO PowerAll_Voorraad_MachineRecord (MachineNumber, Title, Description1, Description2, Description3, Description4, Description5, Description6, SerialNumber, PriceType, Price, Year) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); select SCOPE_IDENTITY()]当我通过代码时,所有值都被正确发布。

这是我的AddDummyData():

public void AddDummyData()
{
  var GroupRecord = new GroupRecord { GroupName = "Oldtimers" };

  groupRecords.Create(GroupRecord);

  var MachineRecord = new MachineRecord
  {
    MachineNumber = 100001,
    Title = "Landini L25",
    Description1 = "Desc 1",
    Description2 = "Desc 2",
    Description3 = "Desc 3",
    Description4 = "Desc 4",
    Description5 = "Desc 5",
    Description6 = "Desc 6",
    SerialNumber = "100000",
    GroupRecord = GroupRecord,
    PriceType = 'I',
    Price = 7999.99m,
    Year = 1954
  };

  machineRecords.Create(MachineRecord);
}

编辑3:

现在它正在运行,这是我的工作代码(对于那些正在努力解决这个问题的人)

Migrations.cs

  public class Migrations : DataMigrationImpl
  {
    public int Create()
    {
      SchemaBuilder.CreateTable("MachineRecord", table => table
        .Column<int>("Id", column => column.PrimaryKey().Identity())
        .Column<int>("GroupRecord_Id")
        .Column<int>("MachineNumber", column => column.NotNull())
        .Column<string>("Title", column => column.NotNull().WithLength(40))
        .Column<string>("Description", column => column.WithLength(70))
        .Column<char>("PriceType", column => column.NotNull().WithLength(1))
        .Column<decimal>("Price", column => column.NotNull())
        .Column<int>("Year", column => column.WithLength(4))
      );

      SchemaBuilder.CreateTable("GroupRecord", table => table
        .Column<int>("Id", column => column.PrimaryKey().Identity())
        .Column<string>("Name")
      );

      return 1;
    }
  }

MachineRecord.cs

  public class MachineRecord
  {
    public virtual int Id { get; set; }
    public virtual int MachineNumber { get; set; }
    public virtual string Title { get; set; }
    public virtual string Description { get; set; }
    public virtual GroupRecord GroupRecord { get; set; }
    public virtual char PriceType { get; set; }
    public virtual decimal Price { get; set; }
    public virtual int Year { get; set; }
  }

GroupRecord.cs

  public class GroupRecord
  {
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
  }

1 个答案:

答案 0 :(得分:4)

问题的关键在于如何构建模型以及如何在Migrations.cs中定义它们之间的关系。

这是我过去使用的解决方案。

首先,包含第二类链接的类。

public class CaptureRecord : ContentPartRecord {
   public virtual string CaptureName { get; set; }
   public virtual OptionsRecord OptionsRecord { get; set; }   
}

注意:继承自ContentPartRecord会为您提供ID。

然后第二个类(在这种情况下我不需要继承ContentPartRecord所以我自己添加ID)

public class OptionsRecord {
  public virtual int Id { get; set; }
  public virtual string Name { get; set; }
}

在Migrations.cs中,在CaptureRecord表定义中添加OptionRecord ID

public class Migrations : DataMigrationImpl
{
    SchemaBuilder.CreateTable("CaptureRecord",
            table => table
            .ContentPartRecord()
            .Column<string>("CaptureName")
            .Column<int>("OptionsRecord_id");

    SchemaBuilder.CreateTable("OptionsRecord",
            table => table
            .Column<int>("Id", column => column.PrimaryKey().Identity())
            .Column<string>("Name"));

    return 1;
}

希望这将使您在如何构建两个表之间的关系方面朝着正确的方向发展。

编辑:要向此类结构添加内容,您需要使用IRepository实例自行手动管理。

所以在你的控制器中AddDummyData给出了一个例子。

 public class MachineController : Controller {
   private readonly IRepository<MachineRecord> _machineRecords;
   private readonly IRepository<GroupRecord> _groupRecords;

   public MachineController(IRepository<MachineRecord> machineRecords, IRepository<GroupRecord> groupRecords) {
     _machineRecords = machineRecords;
     _groupRecords = groupRecords;
   }

   public void AddDummyData(){
     // create a grouprecord in the database
     _groupRecords.Create(new GroupRecord { Id = 1, GroupName = "One" });

     // get the groupRecord just created (annoying that Create doesnt return the instance, 
     // but I dont know a way around this
     var groupRecord = _groupRecords
        .Fetch(x => x.Id == 1)
        .Single();

     // create a machine return with the grouprecord assigned to the GroupRecord property 
     _machineRecords.Create(new MachineRecord { 
        Id = 1,
        ..
        GroupRecord = groupRecord
     });
   }
 }