I have used two different approaches to creating one-to-one relationships in EOF:

1.  Use a "real" one-to-one relationship (A <---> B):
Connect A & B by pk to pk as you have done.
Consider A to be the "owner" of B.  (set "owns destination" on the A ----> B relationship)
Use "Cascade Delete" rule on A ---> B relationship.
Use "Propagates Primary Key" on A ---> B relationship.   <------------ This is the key to making this work.
Leave B ---> A relationship as optional, nullify (do not propagate key here).

Advantage: Simple to implement not business logic needed.
Disadvantage: EOF will create a row in B for every A.

2.  Use a one-to-many relationship (A <--->> B):
Connect A & B with a one-to-many relationship.
Add business logic to restrict the number of B's for each A to one by removing an existing B and replacing it with a new B.

Advantage: Does not need to create empty B's for every A.
Disadvantage: Requires business logic to maintain one B for each A.


On Sep 28, 2006, at 2:04 PM, Chuck Hill wrote:


On Sep 27, 2006, at 4:23 PM, Dev WO wrote:

Hi,
I though everything was good with my oneToOne (pk to pk) relationship, but not completely in fact.

So A and B have a relationship joining their pk.

But B can be "alone", which means I can have B object without A object.

Well, that won't work.  With a PK to PK relationship, EOF expects that both will always exist.  You can sort of work around this by making the optional one a to-many and then adding cover methods like

public A a() {
  return (toAs().count() > 0) ? return (A)toAs().objectAtIndex(0) : null;
}



So it happens that sometimes, when creating a A object (which will create the B object at the same time as the relationship is created) and trying to save it, A got a primary key already used by B which lead to a crash...

Is there a way to get the primary form the B object instead of the A object? (B pks are always good as I cannot have an A object without a B)

Yes, but that still leaves you with EOF thinking that it has a valid reference to an A object when it does not.

Chuck


I've setup my onetoone on both pk and everything is good:)

Thanks a lot:)

I'll wait for tomorrow for the next question;)


Xavier

You really need to set both directions - EOF will not do it for you.

On Sep 26, 2006, at 3:38 PM, Dev WO wrote:

Hi zak,
Dev WO wrote on 9/25/06 1:26 PM:
So this one is a oneToOne relationship, with is specified in both
entities A and B.

[...]

A and B have a foreign key to each other, but only A gets it... B's
foreign key stay "null".

I think you may not be modeling the relationship correctly. If you
really want a 1-to-1, A and B should share the same primary key and A
should be propagating its primary key to B.

If both tables have their own primary keys, and both have foreign keys
to each other, things don't really stand up from a relational logic
point of view because you actually have two relationships -- A is joined
to B by by A.b_id and B is joined to A by B.a_id.

Assuming that A.setB() is defined in terms of A.b_id, the reason B.a_id
doesn't update is that B.a() is defined by B.a_id but the relationship
you just set is defined by A.b_id. You have two separate relationships
based on two separate keys.

HUUUUUU I feel stupid...not the first time though, and probably not the last one too;)

In my case, B can exist alone (without any A to relating to it), but A cannot exist alone, it must be linked to a B.

Does this change anything?
I'll try to make the relationship between pks.

Thanks:)

Xavier

_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:

This email sent to [EMAIL PROTECTED]



_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:

This email sent to [EMAIL PROTECTED]


_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:

This email sent to [EMAIL PROTECTED]


-- 

Practical WebObjects - for developers who want to increase their overall knowledge of WebObjects or who are trying to solve specific problems.    http://www.global-village.net/products/practical_webobjects





_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:

This email sent to [EMAIL PROTECTED]

--
Robert Walker



 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to