Расширение Entity Framework Designer Not loading - PullRequest
0 голосов
/ 04 февраля 2012

Я создал небольшое расширение для дизайнера EF, которое добавляет новое свойство в окно свойств. Я сделал это с помощью проекта vsix (новый проект -> c # -> extensibility -> проект vsix). Когда я нажимаю F5, запускается экспериментальный экземпляр VS. Я создаю новый проект, добавляю модель данных объекта и добавляю объект. Тем не менее, мои точки останова никогда не попадают, и я не вижу собственность. Есть идеи, что я могу делать не так?

public class AggregateRootValue
{
    internal static XName AggregateRootElementName = XName.Get("AggregateRoot", "http://efex");

    private readonly XElement _property;
    private readonly PropertyExtensionContext _context;

    public AggregateRootValue(XElement parent, PropertyExtensionContext context)
    {
        _property = parent;
        _context = context;
    }

    [DisplayName("Aggregate Root")]
    [Description("Determines if an entity is an Aggregate Root")]
    [Category("Extensions")]
    [DefaultValue(true)]
    public string AggregateRoot 
    {
        get 
        {
            XElement child = _property.Element(AggregateRootElementName);
            return (child == null) ? bool.TrueString : child.Value;
        }
        set 
        {
            using (EntityDesignerChangeScope scope = _context.CreateChangeScope("Set AggregateRoot"))
            {
                var element = _property.Element(AggregateRootElementName);
                if (element == null)
                    _property.Add(new XElement(AggregateRootElementName, value));
                else
                    element.SetValue(value);
                scope.Complete();
            }
        }
    }
}

[Export(typeof(IEntityDesignerExtendedProperty))]
[EntityDesignerExtendedProperty(EntityDesignerSelection.ConceptualModelEntityType)]
public class AggregateRootFactory : IEntityDesignerExtendedProperty
{
    public object CreateProperty(XElement element, PropertyExtensionContext context)
    {
        var edmXName = XName.Get("Key", "http://schemas.microsoft.com/ado/2008/09/edm");
        var keys = element.Parent.Element(edmXName).Elements().Select(e => e.Attribute("Name").Value);

        if (keys.Contains(element.Attribute("Name").Value))
            return new AggregateRootValue(element, context);

        return null;
    }
}

РЕДАКТИРОВАТЬ : Я положил код на Github: https://github.com/devlife/Sandbox

EDIT : После добавления компонента MEF в манифест, как это было предложено, расширение по-прежнему никогда не загружается. Вот изображение манифеста:

VSIX Manifest

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

Таким образом, ответ, как выясняется, заключается в том, как я настраиваю свой проект.Я поместил оба класса в проект, который производит файл VSIX.Просто переместив эти классы в другой проект и установив этот проект в качестве компонента MEF в манифесте (и, таким образом, скопировав сборку), он заработал как чудо!

1 голос
/ 26 ноября 2012

Для VS2012 необходимо только добавить Solution как компонент MEF. Просто добавьте все решение как компонент MEF. Тогда это работает на удивление хорошо.

enter image description here

0 голосов
/ 14 ноября 2014

Кажется, dll, созданная вашим проектом, не включается автоматически в сгенерированный пакет VSIX, и VS2013 не дает вам возможности через IDE изменить это (что я могу решить в любом случае).

Вы должны вручную открыть файл проекта и изменить XML. Изменяемое свойство - IncludeAssemblyInVSIXContainer.

Видно здесь: Как включить вывод VSIX в свой пакет?

...