【发布时间】:2012-03-15 09:29:13
【问题描述】:
我正在编写一个自定义模块,该模块使用注入的 IRepository 直接从 Orchard DB 检索和推送数据。
在我需要更新内容部分之前,这可以正常工作。我在我的迁移类中添加了一个更新,并且更新贯穿(使用默认值更新的数据库架构),但是我无法通过 IRepository 更新任何新值。我必须下拉到 NHibernate.ISession 以刷新更改。
这一切都适用于新创建的配方,只有当我改变一个部分时。这里是关键代码sn-ps:
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;
}
}
当我在此示例中添加第二个属性“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();
}
这里是 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();
这似乎有点笨拙......
干杯。
ps 我还在运行 Orchard 1.3.9
pps 经过更多测试,NHibernate 修复程序现在停止工作,所以我最初的发现可能是一个红鲱鱼。 NHibernate 在更新/检索时似乎完全忽略了内容部分的新属性 - 好像对象定义缓存在某处......
【问题讨论】:
标签: orchardcms