3

Orchard IRepository を使用してデータを管理し、db に保存しています...それが私がやろうとしていることです。

私のクラスは:

public class SocietaRecord
{
    public virtual int Id { get; set; }
    public virtual string Club { get; set; }
    public virtual string Email { get; set; }
}

私の移行:

SchemaBuilder.CreateTable("SocietaRecord", table => table
    .Column<int>("Id", column => column.PrimaryKey())
    .Column<String>("Club", c => c.Nullable())
    .Column<String>("Email", c => c.Nullable())
);

ID は IDENTITY ではなく IDENTITY であることに注意してください

ここで、Repository Create を呼び出すと、次の挿入が実行されます: (SQL プロファイラーで取得)

exec sp_executesql N'INSERT INTO Match_SocietaRecord 
(Club, Email) VALUES (@p0, @p1); 
select SCOPE_IDENTITY()',N'@p0 nvarchar(4000),@p1 nvarchar(4000),
@p0=N'Test',@p1=NULL

私のIDを無視し、テーブルに自動番号キーがあると(誤って)想定しているため、失敗します。

これはエラーです:

NHibernate.Exceptions.GenericADOException: could not insert:
[Match.Models.SocietaRecord]
[SQL: INSERT INTO Match_SocietaRecord (Club, Email) VALUES (?, ?); 
select SCOPE_IDENTITY()] ---> System.Data.SqlClient.SqlException: 
Cannot insert the value NULL into column 'Id', table ORCHARD.dbo.Match_SocietaRecord'; 
column does not allow nulls. INSERT fails.

自分のIDを挿入できるように、テーブルを見て、IDがない場合はIDを想定しないようにリポジトリに説明するにはどうすればよいですか? (はい、作成する前にオブジェクト レコードに有効な Id を提供しました)

編集:コードを少し掘り下げましたが、次のように思います:

  • 正しくない ID は Fluent NHibernate によるものです: Auto Mapping Conventions

  • Orchard は、IAutoMappingAlteration を使用して誤った仮定をオーバーライドします

だから私は私の質問を次のように変更できます:

クラスのカスタム IAutoMappingAlteration を定義して、ID が ID ではないことを Orchard に説明するにはどうすればよいですか?

または(言い換えれば)

自動マッピングのドキュメントで説明されているように、オーチャードの「自動マッピング構成」はどこにありますか?

https://github.com/jagregory/fluent-nhibernate/wiki/Auto-mapping

(... 「自動マッピング構成で IsId メソッドをオーバーライドすることにより、オートマッパーが ID を検出する方法を変更できます。」 ... )

4

1 に答える 1

0

Orchard でのリポジトリの実装は、上位レベルのコンテンツ管理 API によって使用されるためのものです。これは、汎用リポジトリの実装または ORM の代替として設計または意図されたものではありません (そのために nHibernate が組み込まれています)。nHibernate を直接使用する必要があります。OrchardPo モジュールの低レベルの例: https://bitbucket.org/bleroy/orchardpo/src

于 2013-01-29T17:28:09.443 に答える