我正在编写一个自定义模块,使用注入的IRepository直接从Orchard DB检索和推送数据.
这工作正常,直到我需要更新内容部分.我在迁移类中添加了更新,并且更新运行(使用默认值更新的数据库模式),但是我无法通过IRepository更新任何新值.我必须进入NHibernate.ISession来刷新更改.
这一切都适用于新创建的配方,只有当我改变一个零件时才会这样.以下是关键代码段:
public class TranslationsPartRecord : ContentPartRecord
{
internal const string DefaultProductName = "Product";
public TranslationsPartRecord()
{
ProductName = DefaultProductName;
}
public virtual string ProductName { get; set; }
}
public class TranslationsPart : ContentPart<TranslationsPartRecord>
{
public string ProductName
{
get { return Record.ProductName; }
set { Record.ProductName = value; }
}
}
public class TranslationsHandler : ContentHandler
{
public TranslationsHandler(IRepository<TranslationsPartRecord> repository)
{
Filters.Add(StorageFilter.For(repository));
}
}
public class Migrations : DataMigrationImpl
{
public int Create()
{
SchemaBuilder.CreateTable("TranslationsPartRecord", table => table
.Column<int>("Id", column => column.PrimaryKey().Identity())
.Column("ProductName", DbType.String, column => column.NotNull().WithDefault(TranslationsPartRecord.DefaultProductName))
);
return 1;
}
public int UpdateFrom1()
{
SchemaBuilder.AlterTable("TranslationsPartRecord", table => table.AddColumn("ProductDescription", DbType.String, column => column.NotNull().WithDefault(TranslationsPartRecord.DefaultProductDescription)));
return 2;
}
}
Run Code Online (Sandbox Code Playgroud)
当我在此示例中添加第二个属性"ProductDescription"时,在运行更新后,列会出现在数据库中但我无法更新它们,直到我重新创建Orchard配方(blat App_Data并再次启动).
这是我试图更新的方式:
// ctor
public AdminController(IRepository<TranslationsPartRecord> translationsRepository)
{
_translationsRepository = translationsRepository;
}
[HttpPost]
public ActionResult Translations(TranslationsViewModel translationsViewModel)
{
var translations = _translationsRepository.Table.SingleOrDefault();
translations.ProductName = translationsViewModel.ProductName;
translations.ProductDescription = translationsViewModel.ProductDescription;
_translationsRepository.Update(translations);
_translationsRepository.Flush();
}
Run Code Online (Sandbox Code Playgroud)
这是NHibernate的"修复":
var session = _sessionLocator.For(typeof(TranslationsPartRecord));
var translations = _translationsRepository.Table.SingleOrDefault();
// is translations.Id always 1?
var dbTranslations = session.Get<TranslationsPartRecord>(translations.Id);
dbTranslations.ProductName = translationsViewModel.ProductName;
dbTranslations.ProductDescription = translationsViewModel.ProductDescription;
session.Update(dbTranslations);
session.Flush();
Run Code Online (Sandbox Code Playgroud)
这似乎有点kludgey ...
干杯.
ps我还在运行Orchard 1.3.9
pps经过更多测试后,NHibernate修复程序现已停止工作,所以也许我最初的发现是红鲱鱼.似乎NHibernate在更新/检索时完全忽略了内容部分的新属性 - 好像对象定义被缓存在某个地方......
如果您的映射没有更新,那很奇怪.您可以尝试通过删除app_data文件夹中的mappings.bin并重新启动应用程序来强制它.Orchard应该重新创建nhibernate映射并保存为mappings.bin.
| 归档时间: |
|
| 查看次数: |
4816 次 |
| 最近记录: |