Sonofagun ... that was it!

Thank you very much, you just saved me a few days of headscratching!

On Wed, Jun 24, 2009 at 10:33 PM, Dario Quintana <
[email protected]> wrote:

> You are creating your schema into the database with
> STC.EI.Data.SessionManager.BuildSchema()
> but the problem is that the schema already exists in there.
>
> Try the feature Schema Update.
>
> On Wed, Jun 24, 2009 at 10:06 PM, x97mdr <[email protected]> wrote:
>
>>
>> Heym
>>
>> I'm trying to map a legacy database system that we have internally
>> that we use to dynamically generate extraction statements from a
>> database.  All of the tables use string identifiers and some of the
>> tables have composite keys.  I've been trying an initial set of 4
>> tables and ran into a problem.
>>
>> Basically, in my model a Relation has any Variables and a Variable can
>> exist on a Relation (although, the same variable name may be on two or
>> more relations ... don't ask!).  We have Modules that consist of
>> Variables with some extra attributes attached for the Variable in the
>> module.
>>
>> Here is my initial stab at the model:
>>
>> Relation
>>
>> [class]
>> public class Relation
>>    {
>>        public virtual string RelationId
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public virtual ISet<Variable> Variables
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public virtual DateTime LastUpdated
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public Relation()
>>        {
>>            Variables = new HashedSet<Variable>();
>>        }
>>
>>        public virtual void AddVariable(Variable variable)
>>        {
>>            Variables.Add(variable);
>>        }
>>
>>        public override bool Equals(object obj)
>>        {
>>            if (obj == null)
>>            {
>>                return false;
>>            }
>>
>>            var other = obj as Relation;
>>
>>            if (other == null)
>>            {
>>                return false;
>>            }
>>
>>            if (other.RelationId != this.RelationId)
>>            {
>>                return false;
>>            }
>>
>>            return base.Equals(obj);
>>        }
>>
>>        public override int GetHashCode()
>>        {
>>            return RelationId.GetHashCode();
>>        }
>>
>> [mapping]
>> <?xml version="1.0" encoding="utf-8" ?>
>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
>>                   assembly="STC.EI.Data"
>>                   namespace="STC.EI.Data.Entities">
>>  <class name="Relation">
>>    <id name="RelationId" type="string">
>>      <generator class="assigned" />
>>    </id>
>>    <timestamp column="last_updated" name="LastUpdated"/>
>>    <set name="Variables" inverse="true" cascade="save-update">
>>      <key column="RelationId"/>
>>      <one-to-many class ="Variable"/>
>>    </set>
>>  </class>
>> </hibernate-mapping>
>>
>> Variable
>>
>> [class]
>>    public class Variable
>>    {
>>        public virtual string VariableId
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public virtual Relation RelationId
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public virtual DateTime LastUpdated
>>        {
>>            get; set;
>>        }
>>
>>        public override bool Equals(object obj)
>>        {
>>            if (obj == null) return false;
>>
>>            var other = obj as Variable;
>>
>>            if (other == null)
>>            {
>>                return false;
>>            }
>>
>>            if (other.VariableId != this.VariableId)
>>            {
>>                return false;
>>            }
>>
>>            if (other.RelationId != this.RelationId)
>>            {
>>                return false;
>>            }
>>
>>            return true;
>>        }
>>
>>        public override int GetHashCode()
>>        {
>>            return VariableId.GetHashCode();
>>        }
>>    }
>>
>> [mapping]
>> <?xml version="1.0" encoding="utf-8" ?>
>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
>>                   assembly="STC.EI.Data"
>>                   namespace="STC.EI.Data.Entities">
>>  <class name="Variable">
>>    <composite-id>
>>      <key-property name="VariableId" />
>>      <key-many-to-one name="RelationId" />
>>    </composite-id>
>>    <timestamp column="last_updated" name="LastUpdated" />
>>  </class>
>> </hibernate-mapping>
>>
>> Module
>>
>> [class]
>>    public class Module
>>    {
>>        public Module()
>>        {
>>            Variables = new HashedSet<ModuleVariable>();
>>        }
>>
>>        public virtual string ModuleId
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public virtual ISet<ModuleVariable> Variables
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public virtual DateTime LastUpdated
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public virtual void AddVariable(ModuleVariable variable)
>>        {
>>            Variables.Add(variable);
>>        }
>>    }
>>
>> [mapping]
>> <?xml version="1.0" encoding="utf-8" ?>
>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
>>                   assembly="STC.EI.Data"
>>                   namespace="STC.EI.Data.Entities">
>>  <class name="Module">
>>    <id name="ModuleId" type="string">
>>      <generator class="assigned" />
>>    </id>
>>    <timestamp column="last_updated" name="LastUpdated"/>
>>    <set name="Variables" table="ModuleVariable" cascade="save-update"
>> inverse="true">
>>      <key column="VariableId" />
>>      <one-to-many class="ModuleVariable"/>
>>    </set>
>>  </class>
>> </hibernate-mapping>
>>
>> ModuleVariable (a variable for a module with attributes attached)
>>
>> [class]
>> public class ModuleVariable
>>    {
>>        public virtual Module ModuleId
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public virtual string VariableId
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public virtual Variable DownloadId
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public virtual Variable UploadId
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public virtual string Repeatable
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public virtual DateTime LastUpdated
>>        {
>>            get;
>>            set;
>>        }
>>
>>        public override bool Equals(object obj)
>>        {
>>            if (obj == null)
>>            {
>>                return false;
>>            }
>>
>>            var other = obj as ModuleVariable;
>>
>>            if (other == null)
>>            {
>>                return false;
>>            }
>>
>>            if (other.ModuleId != this.ModuleId)
>>            {
>>                return false;
>>            }
>>
>>            if (other.VariableId != this.VariableId)
>>            {
>>                return false;
>>            }
>>
>>            return true;
>>        }
>>
>>        public override int GetHashCode()
>>        {
>>            int hash = 13;
>>
>>            hash = hash + (this.ModuleId == null ? 0 :
>> this.ModuleId.GetHashCode());
>>
>>            return hash + (this.VariableId == null ? 0 :
>> this.VariableId.GetHashCode());
>>        }
>>
>> [mapping]
>> <?xml version="1.0" encoding="utf-8" ?>
>> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
>>                   assembly="STC.EI.Data"
>>                   namespace="STC.EI.Data.Entities">
>>  <class name="ModuleVariable">
>>    <composite-id>
>>      <key-many-to-one name="ModuleId" class="Module" lazy="proxy" />
>>      <key-property name="VariableId" />
>>    </composite-id>
>>    <timestamp column="last_updated" name="LastUpdated"/>
>>    <many-to-one name="DownloadId" class="Variable" cascade="save-
>> update">
>>      <column name="DownloadId_VariableId"/>
>>      <column name="DownloadId_RelationId"/>
>>    </many-to-one>
>>    <many-to-one name="UploadId" class="Variable" cascade="save-
>> update">
>>      <column name="UploadId_VariableId"/>
>>      <column name="UploadId_RelationId"/>
>>    </many-to-one>
>>    <property name="Repeatable"/>
>>  </class>
>> </hibernate-mapping>
>>
>> The problem occurs when I try this test:
>>
>>        [Fact]
>>        public void CanAddNewModuleSuccessfully()
>>        {
>>            CreateSchema();
>>
>>            var relation = new Relation
>>            {
>>                RelationId = "PP01"
>>            };
>>
>>            var downloadVariable = new Variable()
>>            {
>>                RelationId = relation,
>>                VariableId = "AGEU"
>>            };
>>
>>            var uploadVariable = new Variable()
>>            {
>>                RelationId = relation,
>>                VariableId = "AGE"
>>            };
>>
>>            relation.AddVariable(downloadVariable);
>>            relation.AddVariable(uploadVariable);
>>
>>            var module = new Module
>>            {
>>                ModuleId = "DEI1"
>>            };
>>
>>            var moduleVariable = new ModuleVariable()
>>                                     {
>>                                         ModuleId = module,
>>                                         VariableId = "AGE",
>>                                         UploadId = uploadVariable,
>>                                         DownloadId =
>> downloadVariable,
>>                                         Repeatable = "R"
>>                                     };
>>
>>            module.AddVariable(moduleVariable);
>>
>>            using (var session = SessionManager.OpenSession())
>>            {
>>                using (var transaction = session.BeginTransaction())
>>                {
>>                    session.Save(module);
>>                    transaction.Commit();
>>                }
>>            }
>>        }
>>
>> I get a TransientObjectException like so:
>>
>> NHibernate.HibernateException: NHibernate.HibernateException : There
>> is already an object named 'Variable' in the database.
>>        ---- System.Data.SqlClient.SqlException : There is already an
>> object
>> named 'Variable' in the database.
>>        C:\Dev\nhibernate-trunk\nhibernate\src\NHibernate\Tool\hbm2ddl
>> \SchemaExport.cs(302,0): at
>> NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Action`1 scriptAction,
>> Boolean export, Boolean justDrop, Boolean format)
>>        C:\Dev\nhibernate-trunk\nhibernate\src\NHibernate\Tool\hbm2ddl
>> \SchemaExport.cs(255,0): at
>> NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Boolean script, Boolean
>> export, Boolean justDrop, Boolean format)
>>        C:\Dev\STC.EI\STC.EI.Data\SessionManager.cs(48,0): at
>> STC.EI.Data.SessionManager.BuildSchema()
>>        C:\Dev\STC.EI\STC.EI.Data.Test\ModuleVariable_Fixture.cs(15,0): at
>> STC.EI.Data.Test.ModuleVariable_Fixture.CreateSchema()
>>        C:\Dev\STC.EI\STC.EI.Data.Test\ModuleVariable_Fixture.cs(21,0): at
>> STC.EI.Data.Test.ModuleVariable_Fixture.CanAddNewModuleSuccessfully()
>>        ----- Inner Stack Trace -----
>>        at System.Data.SqlClient.SqlConnection.OnError(SqlException
>> exception, Boolean breakConnection)
>>        at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
>> exception, Boolean breakConnection)
>>        at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning
>> (TdsParserStateObject stateObj)
>>        at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,
>> SqlCommand cmdHandler, SqlDataReader dataStream,
>> BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject
>> stateObj)
>>        at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String
>> methodName, Boolean async)
>>        at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery
>> (DbAsyncResult result, String methodName, Boolean sendToPipe)
>>        at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
>>        C:\Dev\nhibernate-trunk\nhibernate\src\NHibernate\Tool\hbm2ddl
>> \SchemaExport.cs(146,0): at
>> NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Action`1 scriptAction,
>> Boolean export, Boolean format, Boolean throwOnError, TextWriter
>> exportOutput, IDbCommand statement, String sql)
>>        C:\Dev\nhibernate-trunk\nhibernate\src\NHibernate\Tool\hbm2ddl
>> \SchemaExport.cs(206,0): at
>> NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Action`1 scriptAction,
>> Boolean export, Boolean justDrop, Boolean format, IDbConnection
>> connection, TextWriter exportOutput)
>>        C:\Dev\nhibernate-trunk\nhibernate\src\NHibernate\Tool\hbm2ddl
>> \SchemaExport.cs(292,0): at
>> NHibernate.Tool.hbm2ddl.SchemaExport.Execute(Action`1 scriptAction,
>> Boolean export, Boolean justDrop, Boolean format)
>>
>> Note: I am using the NHibernate from the trunk (so 2.1.0Beta, I
>> believe) if this helps.
>>
>> I am a little confused because the mapping is generated fine and if I
>> work with just Variables and Relations then the entire object graph is
>> persisted.  It seems weird to me but I'm an NHibernate newbie so if
>> someone can offer some help it will be greatly appreciated!
>>
>>
>>
>
>
> --
> Dario Quintana
> http://darioquintana.com.ar
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to