Здравствуйте, Аноним, Вы писали:
Парни, я реально ценю желание помочь и я точно не хотел бы оттолкнуть тех кто хочет помочь, но пожалуйста соотносите ответ с проблемой. я написал так много букв для того чтобы не получать вместо ответа что-то в дуже: "а что ты имел ввиду", "а зачем тебе это вообще нужно" или "да можно, а как именно — гугл в помощь".
А>1. можно, EdmGen использует именно API, как именно — лучше всего глянуть рефлектором
я не хочу использовать рефлектор для такого — это должно быть описано и тот кто с этим работал наверняка знает где порчитать — а парсить утилиту рефлетором с такой целью это как по мне не совсем правильно, как по мне. прежде чем взяться за проблему я конечно же погуглил:
здесь в частности "The EntityModelCodeGenerator and EdmGen.exe command line tool use the EntityClassGenerator class to generate the source code" по этому я использовал его для генерации
EntityClassGenerator generator = new EntityClassGenerator(LanguageOption.GenerateCSharpCode);
var t = generator.GenerateCode(@"G:\Temp\bozz.csdl",@"G:\Temp\aaa.cs");
в результате я получаю ошибку "The EntityClassGenerator is only for use with EntityFrameworkVersions.Version1 and the schemas provided have newer versions of the Model schema. Consider using EntityCodeGenerator or a template."
А>2. Т4 шаблон можно использовать в своем приложении, смотреть Runtime Text Template
я не сомневаюсь что можно — я сказал что сделал это в обычном режиме когда разрабатываю код, но штука в том что это должно быть сделано не в Design-Time — а в Run-Time. в ссылке которую вы дали я к сожалению не нашел ответ на вопрос: как указать T4 шаблон для кастомизации генерации cs кода в утилиту EdmGen или другую которая генерирует cs код по модели данных из базы.
это же не просто трансформация — там есть свой API который можно удобно использовать — вот пример TT который я использую для кастомизации при разработке в Design-time
<#
CodeGenerationTools code = new CodeGenerationTools(this);
MetadataLoader loader = new MetadataLoader(this);
CodeRegion region = new CodeRegion(this, 1);
MetadataTools ef = new MetadataTools(this);
string inputFile = @"BozzEntities.edmx";
EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile);
string namespaceName = code.VsNamespaceSuggestion();
EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this);
// Write out support code to primary template output file
WriteHeader(fileManager);
BeginNamespace(namespaceName, code);
//WriteCustomObservableCollection();
EndNamespace(namespaceName);
// Emit Entity Types
foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{
#>
<#
fileManager.StartNewFile(entity.Name + "Activities.cs");
BeginNamespace(namespaceName+".Activities", code);
#>
<#=Accessibility.ForType(entity)#> <#=code.SpaceAfter(code.AbstractOption(entity))#>partial class Save<#=code.Escape(entity)#>Activity<#=code.StringBefore(" : ", code.Escape("CodeActivity"))#>
{
// Define an activity input argument of type string
public InArgument<<#=code.Escape(entity)#>> Entity { get; set; }
// If your activity returns a value, derive from CodeActivity<TResult>
// and return the value from the Execute method.
protected override void Execute(CodeActivityContext context)
{
// Obtain the runtime value of the Text input argument
<#=code.Escape(entity)#> entity = context.GetValue(this.Entity);
using (BozzEntities db = new BozzEntities())
{
db.<#=code.Escape(entity)#>.AddObject(entity);
db.SaveChanges();
}
}
}
вопрос не в том можно ли сделать это вообще — а в том как это сделать в частности, в Run-Time )