PW Kad
PW Kad

Reputation: 14995

Seeding Many to Many EF Code First Relationship

There are a few other posts on this topic that I saw but I was not able to get a correct answer yet (my own fault I am sure) but I want to seed a database and I have set up a many to many relationship, but I can't figure out how to seed the second entity with the first entities id.

        var users = new List<User>()
        {
            new User()
            {
                Id = 1,
                FirstName = "Clark",
                LastName = "Kent"
            },
            new User()
            {
                Id = 2,
                FirstName = "Lex",
                LastName = "Luther"
            }
        };
        users.ForEach(p => context.Users.Add(p));
        var messages = new List<Message>()
        {
            new Message()
            {
                Id = 1,
                SenderId = 2,
                Recipients = new List<User> { Id = 2, Id = 3}  // <<< Problem is here
            }
        }
        messages.ForEach(p => context.Messages.Add(p));            
        base.Seed(context);

My message class.

public class Message
{
    public int Id { get; set; }
    public int SenderId { get; set; }
    public int RecipientsId { get; set; }
    public virtual User Sender { get; set; }
    public virtual ICollection<User> Recipients { get; set; }
}

My user class.

public class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<Message> Messages { get; set; }
}

To be clear - I can properly seed users with no problem, if there are any typos or copy paste errors they aren't a big deal because I know everything is working besides being able to create a list of recipients that have already been seeded.

Thanks in advance

Upvotes: 2

Views: 2339

Answers (2)

SWilko
SWilko

Reputation: 3612

This is an old thread but Ive just had a similar problem so thought I would offer an answer. You need to query your users object created above

var messages = new List<Message>()
    {
        new Message()
        {
            Id = 1,
            SenderId = 2,
            Recipients = new List<User>()
            {
               users.Single(u => u.Id == 1),
               users.Single(u => u.Id == 2)
        }
    }

Upvotes: 3

nakchak
nakchak

Reputation: 498

First thing i notice is that you are adding Ints to the recipients list, not user objects

What happens if you try code like this:

var users = new List<User>()
    {
        new User()
        {
            Id = 1,
            FirstName = "Clark",
            LastName = "Kent"
        },
        new User()
        {
            Id = 2,
            FirstName = "Lex",
            LastName = "Luther"
        }
    };
    users.ForEach(p => context.Users.Add(p));

    var messages = new List<Message>()
    {
        new Message()
        {
            Id = 1,
            SenderId = 2,
            Recipients = new List<User> {users[0],users[1] }  // <<< Problem is here
        }
    }

    messages.ForEach(p => context.Messages.Add(p));         

    context.SaveChanges();

or you could event try this:

var users = new List<User>()
    {
        new User()
        {
            Id = 1,
            FirstName = "Clark",
            LastName = "Kent"
        },
        new User()
        {
            Id = 2,
            FirstName = "Lex",
            LastName = "Luther"
        }
    };
    users.ForEach(p => context.Users.Add(p));

    var messages = new List<Message>()
    {
        new Message()
        {
            Id = 1,
            SenderId = 2,
            Recipients = new List<User> {context.Users.Where(u=>u.Id==1),context.Users.Where(u=>u.Id==1) }
        }
    }

    messages.ForEach(p => context.Messages.Add(p));         

    context.SaveChanges();

Upvotes: 0

Related Questions