The ADO.NET Entity Framework Beta 3 was released this week. For details, see the ADO.NET team blog.
One of the things that bothered me originally about EDM was that Entity SQL in V1 doesn't contain INSERT, UPDATE, or DELETE statements. Only SELECT. So to update or delete a row, I'd have to fetch it first. Let's start with something simple, like an INSERT with a foreign key constaint?
All of the "add" examples I've seen always insert a new customer and new order and new order details at the same time. But what if your customer already exists?
As an example, the titles table in the pubs database requires a pub_id of an existing publisher. But EDM represents this constraint as a publishers class field in the titles class and an additional publishersReference instance as a member also. My first attempt to create a new title with an existing publisher (pub_id 1389) went like this.
titles t = new titles();
t.title_id = "BU9994";
// rest of columns elided for clarity
// statement to set the pub_id to 1389
My first "statement to set the pub_id to 1389" was:
publishers pub = new publishers();
pub.pub_id = "1389";
t.publishers = pub;
This one tries to add the publisher row too and gets a duplicate key violation.
t.publishers = model.publishers.First(pub => pub.pub_id == "1389");
BUT it causes a SELECT to get the publisher from the database. I wondered at this point if I really needed to do a SELECT to INSERT a row with an existing foreign key row. With some help from Danny Simmons, a much nicer way is to use the publishersReference class and synthesize an EntityKey.
t.publishersReference = new System.Data.Objects.DataClasses.EntityReference<publishers>();
t.publishersReference.EntityKey = new EntityKey("PubsTestEntities.publishers", "pub_id", "1389");
This does the insert correctly with no gratuitous SELECT. Confirmed by SQL Profiler. Good.