3

DbContext 实体的默认 tt 在实体的构造函数中添加了集合属性的初始化代码。每个集合都分配了空的 HashSet

对于标量实体属性 tt 具有以下代码:

public string Property(EdmProperty edmProperty)
{
    return string.Format(
        CultureInfo.InvariantCulture,
        "{0} {1} {2} {{ {3}get; {4}set; }}",
        Accessibility.ForProperty(edmProperty),
        _typeMapper.GetTypeName(edmProperty.TypeUsage),
        _code.Escape(edmProperty),
        _code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
        _code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}

如果我将其更改为:

public string Property(EdmProperty edmProperty)
{
    return string.Format(
        CultureInfo.InvariantCulture,
        "{0} {1} {2} {{ {3}get; {4}set; }}",
        AccessibilityAndVirtual(Accessibility.ForProperty(edmProperty)),
        _typeMapper.GetTypeName(edmProperty.TypeUsage),
        _code.Escape(edmProperty),
        _code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
        _code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}

添加 AccessibilityAndVirtual() EF 开始抛出 InvalidOperationException,表示集合已设置为 EntityCollection。

为什么会这样?

更新:

从 PK 属性中删除 virtual 删除了异常。

4

2 回答 2

3

仅当 PK 属性为虚拟时才会引发异常,因此我更改Property了一些代码

public string Property(EdmProperty edmProperty, MetadataTools ef)
{
    var acessability = Accessibility.ForProperty(edmProperty);

    return string.Format(
        CultureInfo.InvariantCulture,
        "{0} {1} {2} {{ {3}get; {4}set; }}",
        ef.IsKey(edmProperty) ? acessability : AccessibilityAndVirtual(acessability),
        _typeMapper.GetTypeName(edmProperty.TypeUsage),
        _code.Escape(edmProperty),
        _code.SpaceAfter(Accessibility.ForGetter(edmProperty)),
        _code.SpaceAfter(Accessibility.ForSetter(edmProperty)));
}
于 2013-07-24T11:44:20.300 回答
0

我知道这是一个老问题,但我遇到了同样的问题,@Pavel 的答案对我不起作用。

事实证明,当您将所有属性设为虚拟时,您就是在实施变更跟踪代理。在这种情况下,更改跟踪代理将覆盖任何集合导航属性并使用其自己的集合类型 (EntityCollection)。这就是为什么您必须在类的构造函数中取消对导航属性的任何初始化。(删除每个部分类中的 NavigationProperty = new HashSet())

于 2020-11-09T15:28:36.830 回答