简体   繁体   English

EF代码优先通用实体和EntityTypeConfiguration

[英]EF Code first Generic Entity & EntityTypeConfiguration

I'm about to create a Generic Entity and EntityTypeConfiguration for my entities. 我将为我的实体创建一个通用EntityEntityTypeConfiguration here are my classes: 这是我的课程:

IEntity IEntity

public interface IEntity<T>
{
    T Id { get; set; }
}

public interface IAuditableEntity<T>
{
    DateTime CreatedAt { get; set; }
    Membership.User CreatedBy { get; set; }
    int? CreatedById { get; set; }
    DateTime? DeletedAt { get; set; }
    Membership.User DeletedBy { get; set; }
    int? DeletedById { get; set; }
    T RevisionParentId { get; set; }
    bool isLastVersion { get; set; }
}

Entity.cs Entity.cs

public abstract class BaseEntity
{

}

public abstract class Entity<T> : BaseEntity, IEntity<T>
{
    public virtual T Id { get; set; }
}

public abstract class AuditableEntity<T> : Entity<T>, IAuditableEntity<T>
{
    public DateTime CreatedAt { get; set; }
    public virtual Membership.User CreatedBy { get; set; }
    public int? CreatedById { get; set; }
    public DateTime? DeletedAt { get; set; }
    public virtual Membership.User DeletedBy { get; set; }
    public int? DeletedById { get; set; }
    public T RevisionParentId { get; set; }
    public bool isLastVersion { get; set; }
}

The problem is when I try to define a generic EntityTypeConfiguration of AuditableEntity, because : 问题是当我尝试定义AuditableEntity的通用EntityTypeConfiguration时,因为:

public class AuditableEntityConfig<T> : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<T> where T : AuditableEntity<int>
{
    public AuditableEntityConfig()
    {
        HasOptional(x => x.CreatedBy).WithMany().HasForeignKey(x => x.CreatedById);
        HasOptional(x => x.DeletedBy).WithMany().HasForeignKey(x => x.DeletedById);
        Property(x => x.DeletedAt).IsOptional();
        Property(x => x.RevisionParentId).IsOptional();
    }
}

public class User : AuditableEntity<long>
{

}

You see I had to AuditableEntity<int> which is wrong and I have no idea what to replace to get it work. 您看到我必须使用AuditableEntity<int> ,这是错误的,而且我不知道要替换什么才能使其正常工作。 AuditableEntity<int> should be something like AuditableEntity<T> and T can be string, int, guid, long, ... AuditableEntity<int>应该类似于AuditableEntity<T>并且T可以是字符串,int,guid,long,...

UPDATE as suggested by Mike answer, I made changes and updated my question: 由Mike答案更新的建议,我所做的更改和更新我的问题:

public class User : AuditableEntity<int>
{
    [Index("IX_uniqueUsername", IsUnique = true)]
    public string Username { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public bool Active { get; set; }
    public virtual List<Role> Roles { get; set; }
    public virtual List<UserGroup> Groups { get; set; }
    public virtual UserProfile Profile { get; set; }
    public bool isSuperAdmin { get; set; }
}

public class UserConfig : AuditableEntityConfig<User, int>
{
    public UserConfig()
    {
        ToTable("Account_Users");
        Property(x => x.Username).HasMaxLength(200).IsRequired();
        Property(x => x.Password).HasMaxLength(200).IsRequired();
        Property(x => x.Email).HasMaxLength(200);
        HasMany(x => x.Roles).WithMany(x => x.Users).Map(x =>
        {
            x.ToTable("Account_UserRoles");
            x.MapLeftKey("UserId");
            x.MapRightKey("RoleId");
        });
        HasMany(x => x.Groups).WithMany(x => x.Users).Map(x =>
        {
            x.ToTable("Account_UserGroups");
            x.MapLeftKey("UserId");
            x.MapRightKey("GroupId");
        });
    }
}

I get this error now for the RevisionParentId property: 我现在针对RevisionParentId属性收到此错误:

The type 'TK' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'System.Data.Entity.ModelConfiguration.Configuration.StructuralTypeConfiguration<TStructuralType>.Property<T>(System.Linq.Expressions.Expression<System.Func<TStructuralType,T>>)

in this line: 在这一行:

Property(x => x.RevisionParentId).IsOptional();

where T : AuditableEntity<T> will cause recursive type checking. where T : AuditableEntity<T>将引起递归类型检查。 Please try 请试试

UPDATED 更新

public class AuditableEntityConfig<T, TK> : System.Data.Entity.ModelConfiguration.EntityTypeConfiguration<T>
    where T : AuditableEntity<TK> where TK : struct { }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM