c# - How to configure property in Entity Framework with Type and PropertyInfo -
if had simple class this
class person { public int id { get; set; } // ... } and wanted "do something" in ef onmodelcreating id property, such as:
modelbuilder.entity<person>().property( _p => _p.id ).hasdatabasegeneratedoption( databasegeneratedoption.none ); i have no problem. however, when have type , property:
var entitytype = typeof(person); var propinfo = entitytype.getproperty("id"); i want function such
modelentityproperty( modelbuilder, propertytype, entitytype).hasdatabasegeneratedoption( databasegeneratedoption.none ); my question: entityframework allow 1 configure entities/properties using reflection information? or exclusively using these lambdaexpressions?
i ended writing function, long , in opinion uglier may available:
private primitivepropertyconfiguration modelentityproperty( dbmodelbuilder p_model, propertyinfo p_propinfo, type p_entitytype = null ) { // if entitytype not set, use property's declaring type var entitytype = (p_entitytype == null) ? p_propinfo.declaringtype : p_entitytype; // entity <> method- generic method var genericentitymethod = typeof( dbmodelbuilder ).getmethod( "entity", new type[0] ); // actual method type we're interested in var entitymethod = genericentitymethod.makegenericmethod( new type[] { entitytype } ); // return value of .entity{p_type}() var theentityconfigurator = entitymethod.invoke( p_model, new object[0] ); // don't this, works (for now, until change something) var propmethod = theentityconfigurator .gettype() .getmethods( bindingflags.flattenhierarchy | bindingflags.instance | bindingflags.public ) .where( _mi => _mi.name == "property" && _mi.isgenericmethod ) .first() .makegenericmethod( p_propinfo.propertytype ); // whole ugly mess should have been getmethod call, don't know how // set parameter type make sure correct version of method // returned unambiguously // build expression used identify property var paramexpr = expression.parameter( entitytype ); var memberexpr = expression.makememberaccess( paramexpr, p_propinfo ); var lambdaexpr = expression.lambda( memberexpr, paramexpr ); // invoke correct version of property method correct parameter var thepropertyconfiguration = propmethod.invoke( theentityconfigurator, new object[] { lambdaexpr } ); // , return thing return thepropertyconfiguration primitivepropertyconfiguration; } this function works example, needs more general (e.g. datetimes, etc. don't work). there better or more elegant way of doing "natively" within ef? or appropriate method, assuming fixed various valuetypes "property" method can handle?
Comments
Post a Comment