BUG:实体框架电动工具无法生成设计器

时间:2014-12-04 07:47:23

标签: entity-framework

使用Power Tools 4的Entity Framework 6.1在使用命令时会生成错误:

  

在上下文中查看实体数据模型(只读)。

错误:

  

尝试为Context构建模型时发生错误。有关详细信息,请参阅输出窗口。

输出窗口基本上表明:

  

System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---> System.MissingMethodException:找不到方法:' xyz.domain.User xyz.domain.DomainBase.get_ModifiedBy()'

* CRITICAL * 电动工具也在缓存架构,不会随着更改而更新! ***

示例:

创建基类:

public abstract class DomainBase {
    public DateTime DateCreated { get; set; }
    public DateTime DateModified { get; set; }
    public User CreatedBy { get; set; }
    public string CreatedByName { get; set; }
    public User ModifiedBy { get; set; }
    public string ModifiedByName { get; set; }  
}

创建一个继承自基类的类:

public class User : DomainBase {
    public int UserId { get; set; }
    public string Username { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Password { get; set; }
    public string Salt { get; set; }
    public string Pin { get; set; }
}

创建基本映射:

public class DomainBaseConfig<TEntity> : EntityTypeConfiguration<TEntity>
    where TEntity : DomainBase {
    public DomainBaseConfig() {

        this.HasOptional(c => c.ModifiedBy).WithOptionalDependent()
            .Map(m => m.MapKey("ModifiedById"));

        this.HasOptional(c => c.CreatedBy).WithOptionalDependent()
            .Map(m => m.MapKey("CreatedById"));

        this.Property(t => t.CreatedByName).HasMaxLength(FieldMaxSize.FullName).IsRequired();
        this.Property(t => t.ModifiedByName).HasMaxLength(FieldMaxSize.FullName).IsRequired();
        this.Property(t => t.DateCreated).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
        this.Property(t => t.DateModified).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
    }
}

创建用户类映射:

    public UserConfig() {

        this.ToTable("Users");
        this.HasKey(c => c.UserId);
        this.Property(t => t.FirstName).HasMaxLength(FieldMaxSize.FirstName).IsRequired();
        this.Property(t => t.LastName).HasMaxLength(FieldMaxSize.LastName).IsRequired();
        this.Property(t => t.Password).HasMaxLength(FieldMaxSize.Password).IsRequired();
        this.Property(t => t.Pin).HasMaxLength(FieldMaxSize.Pin).IsRequired();
        this.Property(t => t.Salt).HasMaxLength(FieldMaxSize.Salt).IsRequired();
        this.Property(t => t.Username).HasMaxLength(FieldMaxSize.Username).IsRequired().HasColumnAnnotation(IndexAnnotation.AnnotationName,  new IndexAnnotation(new IndexAttribute("IX_Username", 1) { IsUnique = true }));

    }

当试图查看模型时,错误似乎与引用父类需要基础的父类(它们相互引用)有关,而设计者并不喜欢这样,但EF处理它就好了。

证明:如果我删除对&#34;用户&#34;的引用在基类中,设计器将工作(严重)...注意...我通过删除引用User类及其关联映射的基类属性来实现它...但是......设计师STILL MODELS THEM!

因此,我删除了基类中的用户属性(ModifiedBy和CreatedBy),并且我还删除了相关的映射,然后设计器构建了模式的图形表示......但它仍然包含属性I刚刚注释掉了(它们显然已缓存在某个地方)!

请!

(1)更正设计器,使其不会像示例中提供的那样在有效模式上崩溃 (2)修复设计器的缓存问题,以便它永远不会为旧/陈旧代码上的设计者构建模式!

基于此示例,Power Tools设计器完全不可靠,因为它可以清楚地构建一个与实际代码/架构不匹配的模型。

1 个答案:

答案 0 :(得分:1)

对于实体框架&gt; = 6,您需要使用实体框架设计器工具http://www.microsoft.com/en-au/download/details.aspx?id=40762