12

我知道这个问题已经有了解决方案(例如这个问题),但我真的无法将映射逻辑附加到域(POCO 类)所在的同一个程序集中。

还有其他方法吗?

我找到了这篇不错的博客文章,但无法正常工作。这是模型:

public class Institute
{
    /**
        Code omitted
    **/

    protected virtual ICollection<InstituteText> InnerInstituteTexts { get; set; }

    private InstituteTextSet _TextSets;

    public InstituteTextSet Texts 
    {
        get 
        {
            if (_TextSets == null)
                _TextSets = new InstituteTextSet(InnerInstituteTexts);

            return _TextSets;
        }
    }
}

映射代码:

var instituteTextExpression = ObjectAccessor<Institute>.CreateExpression<ICollection<InstituteText>>("InnerInstituteTexts");

institute.HasMany(instituteTextExpression)
    .WithRequired()
    .HasForeignKey(t => t.InstituteId);

其中 CreateExpression 定义为:

public static Expression<Func<T, TResult>> CreateExpression<TResult>(string propertyOrFieldName)
{
    ParameterExpression param = Expression.Parameter(typeof(T), "propertyOrFieldContainer");
    Expression body = Expression.PropertyOrField(param, propertyOrFieldName);
    LambdaExpression lambda = Expression.Lambda(typeof(Func<T, TResult>), body, param);

    return (Expression<Func<T, TResult>>) lambda;
}

我得到的错误是:

初始化方法 Studentum.Core.Tests.InstituteTests.Initialize 抛出异常。System.TypeInitializationException:System.TypeInitializationException:“Studentum.Core.FluentCoreRepositoryFactory”的类型初始化程序引发了异常。---> System.InvalidOperationException:配置的属性“InnerInstituteTexts”不是实体“Institute”上的声明属性。验证它没有被明确地从模型中排除,并且它是一个有效的原始属性。

4

1 回答 1

8

首先想到的是InternalsVisibleTo程序集属性。这允许您命名也可以访问内部成员的“朋友”程序集。我不确定这是否适用于 EF CodeFirst,但我试过了,它似乎工作得很好。您将不得不稍微更改您的模型组件,但我认为这是一个合理的更改。

您首先需要将您的属性声明更改为受保护的内部:

 protected internal virtual ICollection<InstituteText> InnerInstituteTexts { get; set; }

然后,在您的模型程序集中,InternalsVisibleTo在您的 AssemblyInfo.cs 文件中添加带有映射程序集名称的程序集属性。

[assembly: InternalsVisibleTo("MappingAssemblyName")]

最后,您可以在映射程序集中定义属性的映射,就像任何其他可公开访问的属性一样。

institute.HasMany(i => i.InnerInstituteTexts)
    .WithRequired()
    .HasForeignKey(t => t.InstituteId);
于 2011-09-16T16:11:33.177 回答