2014-09-04 9 views
2

Я работаю с ASP.NET и EF 6.1. Я пытаюсь заполнения базы данных с некоторых объектов, но я получаю следующее исключение:Невозможно исключить объект типа исключения

Unable to cast object of type 'System.Collections.Generic.HashSet`1[B]' to type 'B'. 

при попытке создать пользователя с помощью диспетчера пользователей.

Вся инициализация базы данных выполняется методом семян. Я упростил классы, поскольку в некоторых из них есть много параметров.

public class User : IdentityUser 
{ 
    public User() : base() 
    { 
     Bs = new HashSet<B>(); 
    } 

    public Guid AId { get; set; } 
    public virtual A A { get; set; } 

    public virtual ICollection<B> Bs { get; set; } 
} 


public class A 
{ 
    public A() 
    { 
     Bs = new HashSet<B>(); 
     Users = new HashSet<User>(); 
    } 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 

    public virtual ICollection<B> Bs { get; set; } 
    public virtual ICollection<User> Users { get; set; } 
} 


public class B 
{ 
    public B() 
    { 
     Users = new HashSet<User>(); 
    } 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid Id { get; set; } 

    public Guid AId { get; set; } 
    public virtual A A { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
} 

protected override void Seed(myContext context) 
{ 
    var a = new A; 
    var b = new B; 
    A.Bs.Add(B); 
    context.As.Add(A); 
    var userStore = new UserStore<User>(context); 
    var userManager = new UserManager<User>(userStore); 
    var user = new User 
    { 
     UserName = "username", 
     A = a 
    }; 
    userManager.Create(user, "password!"); 
    user.Bs.Add(B); 
    base.Seed(context); 
} 

Я был у него довольно долгое время и действительно не могу понять, почему это не работает. Если я не засеваю базу данных, проблем нет. Посещение базы данных без создания пользователя также не дает мне никаких проблем, но как только я попытаюсь создать пользователя, это произойдет. Не думайте, что это имеет какое-либо отношение к тому, как отношения связаны друг с другом, я удалил каскадные удаления.

ответ

3

В случае, если кто-то сталкивается с той же проблемой, удаление многих из многих соглашений об исключении каскадов привело к трюку. Просто добавьте этот код в контекстный класс

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 
    base.OnModelCreating(modelBuilder); 
} 
Смежные вопросы