i'm in situation have table called elements. i'm creating table called divergences store pairs of elements. purpose of divergence check if 2 elements have diverging answers.
element divergence --------- ---------- elementid elementid1 elementid2 in above table schema, elementid1 , elementid2 foreign keys mapping elementid in elements table , form composite primary key divergence table.
i use database first approach create tables in sql server management studio , later update model database... in entity framework designer.
the problem i'm facing when ef designer generates model creates 2 sets icollection<element> inside element class namely elements , elements1.

this doesn't give me divergences dbset.
what i'd want have divergence class i'd in code:
divergence d = new divergence(); d.element1 = element1; d.element2 = element2; database.divergences.add(d); database.savechanges(); and later on:
element e = database.elements.single(e => e.elementid == 7); var divergences = e.divergences; i tried adding new column divergence table this:
element divergence --------- ------------ elementid divergenceid elementid1 elementid2 this correctly leads 1 <-> * relationship in entity framework designer. divergences dbset divergenceid property useless in code , still 2 sets in element class. it's important note elementid1 , elementid2 still form composite primary key.
what think correct way of mapping specific situation? input.
instead of...
divergence d = new divergence(); d.element1 = element1; d.element2 = element2; database.divergences.add(d); database.savechanges(); ... use:
element1.elements = new list<element>(); // if collection isn't instantiated, example in constructor element1.elements.add(element2); database.savechanges(); this create same sql insert statements link table without need of having divergence entity. (change tracking recognize changed relationship adding item collection , infer necessary sql commands change. element1 , element2 must attached context in state unchanged, required original code in order work correctly.)
also, instead of ...
element e = database.elements.single(e => e.elementid == 7); var divergences = e.divergences; ... can fetch columns divergences table so:
var divergences = database.elements.where(e => e.elementid == 7) .selectmany(e1 => e1.elements.select(e2 => new { elementid1 = e1.elementid, elementid2 = e2.elementid, })) .tolist(); so, desired results without divergence entity , use way. i'm not aware of way force ef create entity database first approach, unless introduce artificial additional column did. if there way hack or more difficult achieve , maintain working ef's default, without divergence entity.
however, consider remove 1 of collections (just delete in model surface). having both bit confusing in model in opinion. or @ least rename them sourceelements , targetelements example :)
Comments
Post a Comment