c# - Update Entity property in EF where property is another entity -
c# - Update Entity property in EF where property is another entity -
i using entity framework 6 , need update properties of entity.
i have next entities:
public class file { public int32 id { get; set; } public byte info { get; set; } public datetime updated { get; set; } public virtual mime mime { get; set; } } public class mime { public int32 id { get; set; } public string name { get; set; } public virtual icollection<file> files { get; set; } } then used following:
_repository.update<file>(file, x => x.data, x => x.mime, x => x.updated); the repository method following:
public void update<t>(t entity, params expression<func<t, object>>[] properties) t : class { _context.set<t>().attach(entity); foreach (var property in properties) { memberexpression look = property.body memberexpression ? (memberexpression)property.body : (memberexpression)(((unaryexpression)property.body) .operand); _context.entry<t>(entity) .property(expression.member.name).ismodified = true; } } this works fine data , updated properties not mime. error:
the property 'mime' on type 'file' not primitive or complex property. property method can used primitive or complex properties. utilize reference or collection method.
is possible create work , integrate on repository method?
yes, think can done. problem here didn't see easy way check whenever property part of table, or navigational property. it's hard phone call right behavior.
if you're interested, take @ ef6 source code, internalentityentry.cs -> property(..) huge amount of property validation through metadata.
the main thought scan conceptual model, , determine whenever property navigational property(eg if property leads table), or if it's complex/primitive.
according that, phone call right functionality.
var propertyname = expression.member.name; var propertytype = __get_property_type__(propertyname); if(propertytype==property || propertytype==complex) { _context.entry<t>(entity) .property(propertyname).ismodified = true; continue; } if(propertytype==navigational){ // hm, need attach first?! // not sure.. have test first. dynamic underlyingreference = entity.gettype() .getproperty(propertyname) .getvalue(entity, null); _context.entry(underlyingreference).state = entitystate.modified; } the grab here have __get_property_type__ works. there's microsoft.data.edm.dll let's work conceptual model, it's not easy think.
this way how ef6 detects if we're dealing reference property or not:
edmmember member; edmentitytype.members.trygetvalue(propertyname, false, out member); var asnavproperty = fellow member navigationproperty; // if asnavproperty!=null, have navigation property. c# .net entity-framework
Comments
Post a Comment