2015-01-05 1 views
1

Я собираюсь создать общий Entity и EntityTypeConfiguration для моих сущностей. вот мои классы:EF Code first Generic Entity & EntityTypeConfiguration

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

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; } 
} 

Проблема заключается в том, когда я пытаюсь определить общий EntityTypeConfiguration из AuditableEntity, потому что:

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> 
{ 

} 

Вы видите, что мне пришлось AuditableEntity<int>, что неправильно, и я понятия не имею, что заменить, чтобы заставить его работать. AuditableEntity<int> должно быть что-то вроде AuditableEntity<T> и T может быть строка, INT, справ, длинные, ...

UPDATE как предложил Майк ответ, я внес изменения и обновил мой вопрос:

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"); 
     }); 
    } 
} 

я получаю эту ошибку теперь для 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>>) 

в Тхи s линия:

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

Что именно вы хотите "работу". Если конфигурация типа вашего объекта имеет тип T, какой тип данных должен отображаться в «RevisionParentId» в базе данных? Что вы пытаетесь достичь, создавая тип этого поля общий? –

+0

'RevisionParentId' - это внешний ключ внешнего подтверждения для одного и того же объекта. в примере: у меня есть объект 'Post', который имеет' Id' типа 'T'. поэтому 'RevisionParentId' должен быть типа' T' слишком – mhesabi

ответ

2

where T : AuditableEntity<T> вызовет рекурсивные проверки типов. Пожалуйста, попробуйте

ОБНОВЛЕНО

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

Я пробовал ваш код и обновлял свой вопрос – mhesabi

+0

Попробуйте мое обновленное решение. Добавили 'где TK: struct' после' AuditableEntity ' –

Смежные вопросы