我有这样的映射:
HasMany(x => x.Orders).KeyColumn("CustomerID");
Run Code Online (Sandbox Code Playgroud)
这导致schemaexport生成这样的约束:
alter table [CustomerOrder]
add constraint FK45B3FB85AF01218D
foreign key (CustomerID)
references [Customer]
Run Code Online (Sandbox Code Playgroud)
我尝试在References()映射上添加.NotFound.Ignore(),以禁止生成约束,但这不起作用.
是否可以定义一个映射来强制SchemaExport不生成约束?
nhibernate nhibernate-mapping fluent-nhibernate schemaexport
我有以下映射:
public class LogEntryMap
{
public LogEntryMap()
{
Map.Id(x => x.Id).GeneratedBy.Identity();
Map(x => x.Context).CustomSqlType("varchar").Length(512);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,使用SchemaExport在SQL Server 2008中生成数据库时,生成的脚本会忽略长度,因此实际上它最终为varchar长度为1:
create table OV_SAC.dbo.[LogEntry] (
Id BIGINT IDENTITY NOT NULL,
Context varchar null,
primary key (Id)
)
Run Code Online (Sandbox Code Playgroud)
.CustomSqlType("varchar 512")抛出一个例外.并且没有定义CustomSqlType,字符串被映射到nvarchar(它确实尊重Length属性).
有什么建议?
那么,新手NHibernate用户; 试图将我的大脑包裹起来.
我正在考虑如何处理部署,以及稍后向Web应用程序注入附加组件(可能需要自己的持久性类).
我认为SchemaExport用于部署可以很好地工作,但我想知道是否有一种方法也让NHibernate以一种基于代码的通用方式告诉我模式导出已经完成或不完成.基本上,我想做像这个伪代码中的东西:
if(!_cfg.HasSchemaForType(typeof(MyType))
ExportSchema(typeof(MyType));
else
UpdateSchema(typeof(MyType));
Run Code Online (Sandbox Code Playgroud)
这两个函数将在内部使用SchemaExport或SchemaUpdate分别使用.
编辑:伙计们,我赞赏到目前为止的答案,但他们错过了一点.我正在尝试设置的是一种方法,允许应用程序添加和删除可能需要更改数据库的附加组件.我不是在谈论版本化我自己的代码之类的东西(至少不是它的主要功能).所以问题不在于我何时部署应用程序,而是关于何时添加或删除插件.是否已经部署过theis插件(因此伪代码类型检查)?如果是,请运行更新.如果没有,请运行导出.合理?
我想生成一个数据库脚本,而没有声明实际的数据库连接字符串.
为了做到这一点,我现在使用NHibernate ExportSchema基于用Fluent NHibernate生成的NHibernate配置(在我的ISessionFactory创建方法期间):
FluentConfiguration configuration = Fluently.Configure();
//Mapping conf ...
configuration.Database(fluentDatabaseProvider);
this.nhibernateConfiguration = configuration.BuildConfiguration();
returnSF = configuration.BuildSessionFactory();
//Later
new SchemaExport(this.nhibernateConfiguration)
.SetOutputFile(filePath)
.Execute(false, false, false);
Run Code Online (Sandbox Code Playgroud)
fluentDatabaseProvider是一个FluentNHibernate IPersistenceConfigurer,需要获取正确的sql方言来创建数据库.
使用现有数据库创建工厂时,一切正常.但我想要做的是在选定的数据库引擎上创建一个NHibernate配置对象,而不需要在场景后面有真正的数据库...而且我无法做到这一点.
如果有人有一些想法.
我正在尝试创建一个简单的数据库应用程序,使用Fluent NHibernate和SQLite跟踪各种类型设备的贷款.但是,当我尝试生成SchemaExport用于单元测试的数据库结构时,不会创建一对多关系的外键.
这是我的Equipment实体:
public virtual int Id { get; set; }
public virtual EquipmentType Type { get; set; }
public virtual int StockId { get; set; }
Run Code Online (Sandbox Code Playgroud)
这是我的映射Equipment:
Id(x => x.Id);
References(x => x.Type);
Map(x => x.StockId);
Run Code Online (Sandbox Code Playgroud)
除了缺少外键之外,SQL是正确生成的:
create table "Equipment" (
Id integer,
StockId INTEGER,
Type_id INTEGER,
primary key (Id)
)
Run Code Online (Sandbox Code Playgroud)
SchemaExport使用SQLite数据库时是否可以生成外键?
谢谢.
sqlite nhibernate foreign-keys fluent-nhibernate schemaexport
当我将SchemaExport与SQL Server 2005一起使用时,它会生成唯一的密钥名称,如:
UQ__Employees__03317E3D
如何生成如下名称:UQ__Employees__Name?即使在SQL Server中!
Grails schema-export在生成DDL以创建特定数据库的数据库模式方面做得很好.但是,我想要做的是,grails只输出DDL以更新已经创建的模式,而不是从头开始创建它的DDL.
我认为它应该是可能的,因为如果您dbCreate = "update"在数据源中具体说明,Grails确实能够实际更新模式.
但我只是希望grails吐出它会运行的内容,而不是实际执行它,所以我可以通过SQL工具以受控方式执行它.
我想在新项目中使用DDD并首先为我的类建模,然后根据类库生成数据库模式.我的计划是使用NHibernate hbm2ddl工具执行此操作SchemaExport.
问题在于我无法使用它SchemaExport,因为它让我遇到了一个奇怪的catch-22问题.SchemaExport需要一个Configuration对象本身需要一个有效的NHibernate配置文件以及一组数据库映射.
这里的catch-22是当我执行Configure()时,它会抱怨"Could not determine the name of the table for entity 'MyEntity'; remove the 'table' attribute or assign a value to it."因此该Configure()方法需要表存在,而SchemaExport应该基于Configuration我无法创建的表来创建它,因为表不是没有'存在.
那么,我究竟应该如何创建一个有效的NHibernate,Configuration其中包含SchemaExport实际做一些有用的事情所需的映射而不Configure()抛出并抱怨它无法找到要创建的表SchemaExport?是否有"模式"我可以设置Configuration对象,因此它不会检查数据库中是否存在给定的表,或者还有其他我需要做的事情?
当数据对象模型发生更改(向类中添加新属性)时,是否有一种方法可以使用流畅的自动化来更改模式,目前它只会删除并重新创建数据库模式,这会丢失数据库中的所有数据.它可以使用Alter表而不是drop/create table,还是我只是在做梦?
可以根据自动化流程更新数据库模式而不会丢失数据吗?
干杯,
nhibernate nhibernate-mapping fluent-nhibernate schemaexport automapping
我在H2数据库中的一些sql语句时出错了.那些sql语句来自Hibernate SchemaExport:这是sql语句:
create table CONTACTS (
person_id bigint not null,
contact_id bigint not null,
primary key (person_id, contact_id)
)
create table PERSON (
id bigint generated by default as identity,
FNAME varchar(55),
NAME varchar(55),
primary key (id)
)
alter table CONTACTS
add constraint UK_r5plahp7wqcsd47hscckyrxgd unique (contact_id)
alter table CONTACTS
add constraint FK_r5plahp7wqcsd47hscckyrxgd
foreign key (contact_id)
references PERSON
alter table CONTACTS
add constraint FK_90n1kse999lanaepr0v6hcgtv
foreign key (person_id)
references PERSON
Run Code Online (Sandbox Code Playgroud)
例如,该行不会在H2中执行.
错误说: [ERROR] Caused by org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement …
schemaexport ×10
nhibernate ×7
.net ×1
asp.net ×1
automapping ×1
database ×1
ddl ×1
fluent ×1
foreign-keys ×1
grails ×1
h2 ×1
hbm2ddl ×1
hibernate ×1
jdbc ×1
sqlite ×1