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 を検出する方法を変更できます。」 ... )