errr ... scratch that. Sorry, I am trying an experimental Fluent Nhibernate
project with the same set of data but without the string-based keys (to get
rid of the funky mappings) and I ran my test in there.  This is what I get
for trying out something at 6am :-)

When I drop all of the tables in my test database manually and re-create the
schema from scratch (using BuildSchema) the test still fails with hte
TransientObjectException ...

On Thu, Jun 25, 2009 at 6:03 AM, Jeffrey Cameron
<[email protected]>wrote:

> 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