2012-11-16 90 views
2

我想MachineRecord包含一個GroupRecord標識,如下所示:如何在Orchard中創建表關係?

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:

現在,它的工作,這是我工作的代碼(對於那些誰是掙扎在這個太)

遷移.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; } 
    } 

回答

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 
    }); 
    } 
} 
+0

謝謝您的回答,但是這是我究竟是如何做到的,但我認爲問題是,我不繼承ContentPartRecord任何模型,因爲我不需要這個。我只是讓這些類與您的OptionsRecord類相同,我自己也添加了一個Id。這可能是問題嗎?有沒有辦法做到這一點,而不從ContentPartRecord繼承? – avb

+1

只要您添加自己的ID並將其作爲主鍵,身份等,繼承ContentPartRecord就無關緊要。從Orchard實際得到的錯誤知道它不起作用的錯誤是什麼? – endorphin

+0

我沒有從Orchard得到任何錯誤,並且如果我使用斷點en檢查結果視圖GroupRecord的值爲NULL。 (是的,我在db中添加了一個具有該Id的組:))。我將在一分鐘內發佈我的代碼。感謝您一直以來的幫助! – avb