2014-03-27 56 views
2

好吧,這應該相當容易。果園:如何堅持無記錄的記錄

我想爲我的模塊在Orchard(1.7.2)中保留一些記錄,而這些記錄也不是ContentPartRecord。

換句話說,我希望能在DB堅持以下對象:..這已被映射到數據庫

public class LogItemRecord 
{ 
    public virtual string Message { get; set; } 
} 

。但請注意,此類不是從ContentPartRecord派生的,因爲它絕對不是一個派生類。

然而,當我打電話IRepository實例的.Create方法,我得到的是一個糟糕的NHibernate的異常:

沒有留存爲:MyModule.Models.LogItemRecord

...會消失,如果我do聲明LogItem記錄是從ContentPartRecord繼承的,但試圖堅持認爲,除了hacky-tacky之外,它會遇到它自己的異常,其中nHibernate再次公正地聲稱記錄的Id值爲零,儘管沒有那麼多的話。

那麼......我如何與Orchard很好地玩,並使用它的API來保存我自己的不是ContentParts/ContentItems的對象?

+0

您是否使用Migrations.cs在數據庫中創建了一個表來存儲該對象? – Hazza

+0

是的,我有。問題是如何在不繼承ContentPartRecord的記錄的情況下持久化對象。 – NetizenKane

回答

1

我跑1.7.3(1.7.2中還測試),並已成功能堅持下面的類的DB:

public class ContactRecord 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string JobTitle { get; set; } 
    public virtual string Email { get; set; } 
    public virtual string Phone { get; set; } 
} 

下面是Migrations.cs

相關線路
SchemaBuilder.CreateTable(
    typeof(ContactRecord).Name, 
    table => table 
     .Column<int>("Id", col => col.Identity().PrimaryKey()) 
     .Column<string>("Name") 
     .Column<string>("JobTitle") 
     .Column<string>("Email") 
     .Column<string>("Phone") 
); 

我會假設你已經顯示了LogItemRecord的代碼是完整的類定義進行以下語句時...

我認爲您在DB 中存儲的任何Record類需要Id屬性,並且該屬性在表定義中應該標記爲IdentityPrimaryKey(如我上面所做的那樣)。

當你創建一個*Record類從ContentPartRecord和設置表繼承像

SchemaBuilder.CreateTable(
    "YourRecord", 
    table => table 
     .ContentPartRecord() 
     // more column definitions 
); 

那麼你得到的Id屬性/ PK「免費」的繼承和遷移調用.ContentPartRecord()

查看Orchard Training Demo Module中的PersonRecord關於將標準類作爲記錄存儲在DB中的另一個示例。

+0

缺少的Id屬性就是它!實體框架按照慣例需要一個Id屬性;顯然NHibernate不這樣做。謝謝! – NetizenKane

+0

非常好!樂於幫助 – kaveman