c# - Either OData or Code-First fails: derived navigation properties -


i'm having complex situation either problem code-first portion of project, or problem odata portion of project...

i have abstract class person of derive 2 classes user , driver:

[datacontract] [knowntype(typeof(user))] [knowntype(typeof(driver))] public abstract class person {     [key, datamember]     public int id { get; set; }     [datamember]     public int relationid { get; set; } }  public class user : person { } public class driver : person { } // shortened sake of readability 

now have model relation, can contain both users and/or drivers.

[datacontract] public class relation {     [key, datamember]     public int id { get; set; }     [datamember]     public virtual icollection<user> users { get; set; }     [datamember]     public virtual icollection<driver> drivers { get; set; } } 

the problem is, when let code-first generate migration code, can see wants add 2 columns relation_id , relation_id1 in order cope mapping of users , drivers. applied [inverseproperty("id")] attribute both navigation properties in order try solve (as described here: code first dataannotations). still, problem persists. so, not working.

now, say: why not make icollection<person> people property, , use this.db.people.oftype<user>() in order cast objects right model , retrieve way. acceptable, turns odata problem.

i want able call public iqueryable<user> getusers([fromodatauri] int key) relations controller in order use /odata/relations(16)/users users relation. if there no users property present in relation model, odata parser rejects such call because can not resolve correct method.

so i'm stuck between designs of both worlds. i'm guessing in order correctly solve problem, focus should lie on code-first part, not on odata part. ideas appreciated, in advance!

you can add icollection people property , exclude users , drivers properties data model. example,

[datacontract] public class relation {     [key, datamember]     public int id { get; set; }      [datamember]     public virtual icollection<person> people { get; set; }            [datamember]     public virtual icollection<user> users     {                 {             return people.oftype<user>();         }     }      [datamember]     public virtual icollection<driver> drivers     {                 {             return people.oftype<driver>();         }     } } 

in dbmodelbuilder code exclude users , drivers properties doing,

    protected override void onmodelcreating(dbmodelbuilder modelbuilder)     {         var relation = modelbuilder.entity<relation>();         relation.ignore(p => p.users);         relation.ignore(p => p.drivers);     } 

in odatamodelbuilder, exclude people property if want to.


Comments

Popular posts from this blog

How to mention the localhost in android -

php - Calling a template part from a post -

c# - String.format() DateTime With Arabic culture -