Невозможно обновить EntitySet - потому что у него есть DefiningQuery и нет < UpdateFunction > элемент существует

Насколько я знаю, они идентичны. Я думаю, что там может быть несколько двигателей, которые не поддерживают пронумерованный синтаксис, но я не уверен, что. Я смутно вспоминаю вопрос о SO несколько дней назад, когда явное обозначение не работает в Notepad ++.

Единственный раз, когда я буду использовать явно пронумерованное повторение, - это когда повторение больше 1:

  • Точно два: {2}
  • Два или более: {2,}
  • Два-четыре: {2,4}

Я предпочитаю это особенно, когда повторяющийся рисунок больше нескольких символов. Если вам нужно сопоставить 3 числа, некоторым людям нравится писать: \d\d\d, но я бы предпочел написать \d{3}, поскольку он подчеркивает количество повторений. Кроме того, по дороге, если это число когда-либо должно измениться, мне нужно только изменить {3} на {n}, а не повторно анализировать регулярное выражение в моей голове или беспокоиться о том, чтобы испортить его; это требует меньших умственных усилий.

Если эти критерии не выполнены, я предпочитаю сокращение. Использование «явной» записи быстро загромождает шаблон и затрудняет его чтение. Я работал над проектом, в котором некоторые разработчики не слишком хорошо знали регулярное выражение (это не совсем любимая тема для всех), и я видел много {1} и {0,1} случаев. Несколько человек попросят меня пересмотреть свой шаблон, и именно тогда я предлагаю изменить эти события на сокращенную нотацию и сэкономить место, а ИМО улучшить читаемость.

499
задан Mike Dimmick 7 April 2015 в 15:39
поделиться

1 ответ

Я нашел исходный ответ обновления .edmx работы файла лучше всего в моей ситуации. Я просто не был слишком доволен изменением модели каждый раз, когда это было обновлено от базы данных. Вот почему я записал дополнительный текстовый Шаблонный файл, который автоматически вызывается, когда после того, как модель изменилась - точно так же, как объекты недавно сгенерированы. Я отправляю его здесь в этом комментарии. Чтобы заставить его работать, удостоверьтесь, что Вы называете его как {имя модели} .something.tt и храните его в той же папке как Ваша .edmx папка. Я назвал это {имя модели}.NonPkTables.tt. Это не генерирует файл самостоятельно из-за недопустимого определения расширения файла во второй строке. Не стесняйтесь использовать.

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ output extension="/" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="System.Xml.Linq"#>
<#@ assembly name="%VS120COMNTOOLS%..\IDE\EntityFramework.dll" #>
<#@ assembly name="%VS120COMNTOOLS%..\IDE\Microsoft.Data.Entity.Design.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Windows.Forms" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ import namespace="System.Globalization" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Data.Entity.Core.Metadata.Edm" #>
<#@ import namespace="System.Data.Entity.Core.Mapping" #>
<#@ import namespace="System.CodeDom" #>
<#@ import namespace="System.CodeDom.Compiler" #>
<#@ import namespace="Microsoft.CSharp"#>
<#@ import namespace="System.Text"#>
<#@ import namespace="System.Diagnostics" #>

<#
    string modelFileName= this.Host.TemplateFile.Split('.')[0] + ".edmx";
    string edmxPath = this.Host.ResolvePath( modelFileName );

    // MessageBox.Show( this.Host.TemplateFile + " applied." );
    var modelDoc = XDocument.Load(edmxPath);
    var root = modelDoc.Root;
    XNamespace nsEdmx = @"http://schemas.microsoft.com/ado/2009/11/edmx";
    XNamespace ns = @"http://schemas.microsoft.com/ado/2009/11/edm/ssdl";

    var runtime = root.Elements(nsEdmx + "Runtime").First();
    var storageModels = runtime.Elements(nsEdmx + "StorageModels").First();
    XNamespace nsStore = @"http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator";

    var schema = storageModels.Elements(ns + "Schema").First();
    XNamespace nsCustomAnnotation = @"http://schemas.microsoft.com/ado/2013/11/edm/customannotation";

    var entityTypes = schema.Nodes().OfType<XComment>().Where(c => c.Value.Contains("warning 6002: The table/view"));
    bool changed = false;

    foreach (var node in entityTypes)
    {
        var element = node.ElementsAfterSelf().First();
        string entityName = element.Attribute("Name").Value;

        // Find EntitySet in EntityContainer.
        var entityContainer = schema.Elements(ns + "EntityContainer").First();
        var entitySet = entityContainer.Elements(ns + "EntitySet").First(s => s.Attribute("Name").Value == entityName);

        // Change "store:Schema" attribute to "Schema" attribute.
        var attribute = entitySet.Attribute(nsStore + "Schema");

        if (attribute != null)
        {
            string schemaName = entitySet.Attribute(nsStore + "Schema").Value;
            entitySet.Attribute(nsStore + "Schema").Remove();
            entitySet.Add(new XAttribute("Schema", schemaName));
            changed |= true;
        }

        // Remove the DefiningQuery element.
        var definingQuery = entitySet.Element(ns + "DefiningQuery");

        if (definingQuery != null)
        {
            definingQuery.Remove();
            changed |= true;        
            Debug.WriteLine(string.Format("Removed defining query of EntitySet {0}.", entityName));
        }
    }

    if (changed)
        modelDoc.Save(edmxPath);
#>
0
ответ дан 22 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: