Entities

Binding Entities to Form Controls

Binding Entities to Forms controls - easily done but not easily divined.

The naive would hook a LinQ query to the BindingSource's DataSource - and would be rewarded with a functional binding - most of the time.  In fact for read only lists of things this may be acceptable (adding/deleting objects causes inconsitencies in the ObjectManager).  One piece of advice I ran across is to not use this type of binding because every time the BindingSource moves to a different record it rexecutes the query (not confirmed by my testing but it may be true) which could be handy in a highly concurrent environment.

After much gnashing and googling I came across the "proper" way to do this (actually it's in book: "Programming Entity Framework" - O'Reilly"):

ObjectQuery<User> query;
...
query = ( from var in m_model.Users
          orderby var.sortorder, var.name
          select var
          ) as ObjectQuery<User>;
userBindingSource.DataSOurce = query;

As long as you cast the LinQ query to a ObjectQuery<T>, the BindingSource coordinates everything properly.

 

Typing: The query is run on the EntitySet while the ObjectQuery<T> is typed to the underlying object.

Deferred Identities

So how does one use identity keys (a.k.a AutoIncrement IDs) with Entities? It's simple. Really. Just not quite what I expected. Assume this table:
CREATE TABLE svar (
	id INTEGER PRIMARY KEY NOT NULL, 
	name NVARCHAR(32) DEFAULT NULL,
);
Simple. Inserting a record should increment the id field ensuring that it's always unique. But the Entities thing has no provisions for this - or does it? It's not in the GUI (yet?), you have to edit the XML (.edmx) directly, adding an attribute to the column definition:
StorageGeneratedPattern="Identity"
This informs the EF system that the column is generated on insert and that it's to read back the value immediately after an insert - which it appears to do.
StorageGeneratedPattern="Computed"
This tells the EF system that the column is computed on update (or insert) and is to be read back immediately after an update,
StorageGeneratedPattern="None"
The default case - do nothing.
So, for the above table, modify the .edmx file like below (in the SSDL section):
        <EntityType Name="svar">
          <Key>
            <PropertyRef Name="id" />
          </Key>
          <Property Name="id" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" />
          <Property Name="name" Type="nvarchar" MaxLength="32" />
Syndicate content