0

我为 EF 设计器创建了一个小扩展,它向属性窗口添加了一个新属性。我使用 vsix 项目(新项目-> c#-> 可扩展性-> 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

编辑:按照建议将 MEF 组件添加到清单后,扩展仍然永远不会加载。这是清单的图片:

VSIX 清单

4

3 回答 3

2

因此,事实证明,答案在于我如何设置我的项目。我将这两个类都放在生成 VSIX 文件的项目中。通过简单地将这些类移动到另一个项目并将该项目设置为清单中的 MEF 组件(并因此复制程序集),它就像一个魅力!

于 2012-02-07T13:49:28.793 回答
1

对于 VS2012,也只需添加解决方案作为 MEF 组件。只需将整个解决方案也添加为 MEF 组件。然后它工作得非常好。

在此处输入图像描述

于 2012-11-26T07:55:12.227 回答
0

似乎您的项目构建的 dll 不会自动包含在生成的 VSIX 包中,并且 VS2013 不会通过 IDE 为您提供更改此选项的选项(无论如何我都可以解决)。

您必须手动打开项目文件并更改 XML。要更改的属性是 IncludeAssemblyInVSIXContainer。

在这里看到:如何在它的包中包含 VSIX 输出?

于 2014-11-14T13:48:16.343 回答