I am having an issue with ActiveRecord erroring out when saving.  I
know active record should be able to handle this scenario as I've
mocked it up in a simple demo project and it works just fine.  But in
my application it does not work.  Here's a simplified scenario.

I have two tables, Customer and Email.  Customer has an ID (sql server
identity field), a First (string) and Last (string) fields.  The Email
table has an EmailID (sql server identity field), CustomerID (foreign
key referencing the customer table) and Address (string).

Here's the simplified Customer class:

[ActiveRecord("Customer")]
    public class Customer : ActiveRecordBase<Customer>, ICustomer
    {
        [PrimaryKey(Generator = PrimaryKeyType.Identity, Column =
"CustomerID")]
        public virtual int ID { get; set; }

        [Property]
        public virtual string First { get; set; }

        [Property]
        public virtual string Last { get; set; }

        [HasMany(typeof(Email), Cascade =
ManyRelationCascadeEnum.AllDeleteOrphan, Table = "Email", ColumnKey =
"CustomerID")]
        public virtual IList<Email> Emails { get; set; }
    }

And the email class:
    [ActiveRecord("Email")]
    public class Email : ActiveRecordBase<Email>, IEmail
    {
        [PrimaryKey(Generator = PrimaryKeyType.Identity, Column =
"EmailID")]
        public virtual int ID { get; set; }

        [BelongsTo(Column = "CustomerID")]
        public virtual Customer CustomerID { get; set; }

        [Property]
        public virtual string Address { get; set; }

    }

In a simple demo project, attempting something like the following
works just fine:

 var customer = new Customer();
 customer.First = "First";
 customer.Last = "Last";
 customer.Emails = new List<Email>();

 var email = new Email();
 email.Address = "[email protected]";
 email.CustomerID = customer;
 customer.Emails.Add(email);
 customer.Save();

But, in production (more complicated scenario but essentially doing
the same thing) it errors out.  An error similar to this gets thrown:

Castle.ActiveRecord.Framework.ActiveRecordException: Could not perform
Update for Customer ---> NHibernate.Exceptions.GenericADOException:
could not insert: [****.***.Email][SQL: INSERT INTO Emails (Address,
CustomerID) VALUES (?, ?); select SCOPE_IDENTITY()] --->
System.Data.SqlClient.SqlException: Cannot insert the value NULL into
column 'CustomerID', table '****.***.Email'; column does not allow
nulls. INSERT fails.
The statement has been terminated.

So, obviously AR thinks the Customer object hasn't been saved yet and
therefore it doesn't have an ID value to put into the CustomerID field
in the Emails table.  I could set this column to allow NULLS but this
doesn't seem the right approach.

Does anyone have an idea why AR would choke in a scenario like this?
Like I said, I am able to do this very easily with a simple dummy mock
up.  But, in production, where things are more complicated, it is
failing.  Any thoughts/help appreciated!

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" 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/castle-project-users?hl=en.

Reply via email to