Ці ёсць спосаб прагляду адлюстравання Entity Framework Code First ў Стоўбцах падчас выканання?

Я спрабую напісаць надбудову да Entity Framework Code First і мне патрэбен спосаб, каб атрымаць канфігурацыю слупкоў мадэлі падчас выканання. Напрыклад, гэта код ўстаноўкі на OnModelCreating па DbModelBuilder :

builder.Entity()
    .Property(n => n.ReportsToID).HasColumnName("ReportsTo");

Як толькі гэта будзе зроблена, EntityFramework ведае, што імя маёй уласнасці з'яўляецца адрозніваецца ад імя слупка ў табліцы, але як я магу знайсці, што радок «ReportsTo» адносіцца да ReportsToID сам падчас выканання? У ідэале, я спрабую напісаць метад, такія як наступныя:

public string GetMappedColumnName(DbContext context, 
    Func selector);

Якой будзе выкарыстоўвацца як:

string mappedColumnName = GetMappedColumnName(context, 
    x => x.ReportsToID);

Я проста не ведаю, дзе знайсці адлюстраванне імёны слупкоў у межах DbContext. Ці з'яўляюцца яны даступныя нават?

5
Там гэтае рашэнне (некалькі) тут: stackoverflow.com/a/20807366/861716 .
дададзена аўтар Gert Arnold, крыніца
Я быў бы вельмі цікава ўбачыць сапраўднае рашэнне. Не маглі б вы апублікаваць яго ў якасці яшчэ аднаго адказу? Было б вельмі карысна для мяне.
дададзена аўтар STW, крыніца
я меў падобную праблему. вось маё рашэнне: stackoverflow.com/questions/7008212/…
дададзена аўтар maxlego, крыніца

1 адказы

Тэарэтычна так. Практычна я не ўпэўнены, таму што з простым тэстам, я не быў у стане атрымаць гэтыя дадзеныя падчас выканання - я бачу іх у адладчык, але я не магу атрымаць іх, таму што тып мне трэба выкарыстоўваць ўнутраны ў рамках сутнасці.

Тэорыя. Уся інфармацыя адлюстравання даступныя падчас выканання, але не празь адлюстравання. Яны захоўваюцца ў экзэмпляры на MetadataWorkspace , які быў вызначана не прызначаны для непасрэднага выкарыстання, таму што кожнае ўзаемадзеянне з гэтым класам патрабуе некаторага часу марнаваць ў адладчык, перш чым знайсці, як атрымаць дадзеныя, неабходныя. Гэтыя дадзеныя не даступныя праз DbContext API. Вы павінны пераўтварыць DbContext назад ObjectContext і атрымаць доступ да MetadataWorkspace .

ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
GlobalItem storageMapping = objContext.MetadataWorkspace.GetItem("NameOfYourContextClass", DataSpace.CSSpace);

Цяпер storageMapping з'яўляецца асобнікам System.Data.Mapping.StorageEntityContainerMapping класа, які з'яўляецца ўнутраны . Як я разумею, гэты клас павінен быць падчас выканання прадстаўлення MSL = адлюстраванне паміж захаваннем і канцэптуальнай мадэллю.

Пры выкарыстанні адладчыка вы можаце вывучыць асобнік, і вы знойдзеце звесткі аб супастаўленні паміж ўласцівасцямі і слупкамі (яго досыць глыбока укладзеным), так што вы можаце таксама выкарыстоўваць адлюстраванне, каб атрымаць іх, але гэта адлюстраванне на ня адкрытым інтэрфейсе класаў вы не валодаеце таму любая .NET Framework латка/выпраўленне/абнаўленне можа прывесці да паломкі вашага прыкладання.

4
дададзена
@Sebastian: Гэта пытанне для ADO.NET каманды. Я не магу адказаць, чаму гэта так складана, але менавіта так, як MS API, як правіла, працуюць - яны ўнутрана складаныя і закрыты для любога пашырэння, якое першапачаткова не меркавалася РС.
дададзена аўтар Ladislav Mrnka, крыніца
Пасля таго, як я меў GlobalItem кропка ўваходу, астатняе было лёгка! Дзякуючы.
дададзена аўтар GenericTypeTea, крыніца
Чаму гэта так складана, каб атрымаць гэтую інфармацыю? EF сапраўды дрэнна, калі справа даходзіць да выканання аб'ёмных уставак. Вы можаце выкарыстоўваць карыстацкія EntityDataReader і SqlBulkCopy, каб атрымаць працу, але толькі калі ў вас ёсць гэтыя адлюстравання. Я не хачу, каб жорстка закадаваць гэтыя адлюстравання зноў і зноў толькі, каб зрабіць уручную выправіць кожны раз, калі адзін з гэтых адлюстраванняў зменаў. Я ведаю, OR/M не пра масавых дадзеных. Але разгледзець імпарт з іншых сістэм, дзе вы павінны зрабіць аб'ёмныя ўстаўкі. Што цяпер?
дададзена аўтар Sebastian Weber, крыніца
Ці магчыма, што вы даяце шлях доступу імёны слупкоў? усё, што я бачу, з'яўляюцца імёнамі уласцівасцяў аб'екта, а не імёны слупкоў
дададзена аўтар Cedric Dumont, крыніца
на самай справе гэты пост дапамог мне атрымаць імя ператворанага слупка ў эф: stackoverflow.com/questions/20161854/…
дададзена аўтар Cedric Dumont, крыніца