User login |
EntitiesBinding Entities to Form ControlsBinding 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:
<EntityType Name="svar">
<Key>
<PropertyRef Name="id" />
</Key>
<Property Name="id" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" />
<Property Name="name" Type="nvarchar" MaxLength="32" />
|