实体框架4 - 在持久性不知情的上下文中使用CTP5(代码优先)映射非公共属性

Kra*_*zek 12 code-first entity-framework-4 ef-code-first entity-framework-ctp5 entity-framework-4.1

我知道这个问题已经有了解决方案(例如这个问题),但是我真的无法将映射逻辑附加到域(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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

映射代码:

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

institute.HasMany(instituteTextExpression)
    .WithRequired()
    .HasForeignKey(t => t.InstituteId);
Run Code Online (Sandbox Code Playgroud)

其中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;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

初始化方法Studentum.Core.Tests.InstituteTests.Initialize抛出异常.System.TypeInitializationException:System.TypeInitializationException:'Studentum.Core.FluentCoreRepositoryFactory'的类型初始值设定项引发异常.---> System.InvalidOperationException:配置的属性'InnerInstituteTexts'不是实体'Institute'的声明属性.验证它是否未从模型中明确排除,并且它是有效的原始属性.

Mic*_*ito 8

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

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

 protected internal virtual ICollection<InstituteText> InnerInstituteTexts { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

[assembly: InternalsVisibleTo("MappingAssemblyName")]
Run Code Online (Sandbox Code Playgroud)

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

institute.HasMany(i => i.InnerInstituteTexts)
    .WithRequired()
    .HasForeignKey(t => t.InstituteId);
Run Code Online (Sandbox Code Playgroud)

  • 它在程序集属性中命名您的映射程序集.但是,它没有引用程序集(没有循环依赖性问题),映射类,实体框架或任何持久性特定的.我认为从实际的角度来看,这仍然会使你的模型"坚持不知不觉".如果你想达到关于"意识"的非常技术水平,可以声称你的模型已经暴露于持久性的细节,因为你必须使所有映射的属性"虚拟". (2认同)