Entity Framework mapping two table columns to same related table Key -


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.

enter image description here

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