MCV3 Entity Framework 4: код первый: добавление подобъектов в базу данных - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь научить себя MVC3 и EF4, используя сначала код и генератор DbContext, так что извините, если это глупый вопрос.

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

public class User
{
    [Key]    
    public int Id { get; set; }    
    public string User_Name { get; set; }
    public string Password { get; set; }
    public string First_Name { get; set; }
    public string Last_Name { get; set; }

    public virtual ICollection<Email> Emails { get; set; }
}

public class Email
{
    [Key]
    public int Id { get; set; }
    public string Address { get; set; }

    public User User { get; set; }        
}

Я с радостью управляю пользовательским классом с помощью методов CRUD, собранных MVC3, и вставляю пользователей программно, чтобы «заполнить» базу данных тестовыми данными, последнее, что я делаю так, переопределяя метод Seed в DropCreateDatabaseAlways класс вроде так:

public class dbInitializer : DropCreateDatabaseAlways<UserContext>
{
    protected override void Seed(UserContext context)
    {
        var Users = new List<User>
        {
            new User {  User_Name = "uname",
                        Password = "pword",
                        First_Name = "fname",
                        Last_Name = "sname",
            }
        };

        Users.ForEach(u => context.Users.Add(u));
    }
}

Теперь я также хотел бы добавить адреса электронной почты, и из-за того, как я настроил код своих классов, сначала очевидно, что у каждого пользователя может быть несколько адресов электронной почты, и каждый адрес электронной почты может принадлежать только одному пользователю, потому что при создании Для нового пользователя или объекта электронной почты intellisense (VS10) предоставляет мне свойства Emails и User, которые на самом деле не являются частью какого-либо класса.

У меня такой вопрос: как добавить адрес электронной почты пользователю, как он был создан, и как добавить адрес электронной почты пользователю, который был создан ранее?

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Добавление электронной почты новому пользователю

protected override void Seed(UserContext context)
{
    var Users = new List<User>
    {
        new User {  User_Name = "uname",
                    Password = "pword",
                    First_Name = "fname",
                    Last_Name = "sname",
                    Emails = new List<Email> { new Email { Addess = "foo@bar.baz" } }
        }
    };

    Users.ForEach(u => context.Users.Add(u));
}

Аналогично для существующего пользователя.

user.Emails.Add(new Email { Addess = "foo@bar.baz" });

user.Emails.Add выдаст запрос базы данных для загрузки коллекции электронной почты (т. Е. Отложенная загрузка). Альтернативный способ сделать это

var email = new Email { Addess = "foo@bar.baz", User = user };
context.Emails.Add(email);
1 голос
/ 19 марта 2012

Добавление электронных писем пользователю при его создании:

protected override void Seed(UserContext context)
{
    var Users = new List<User>
    {
        new User {  User_Name = "uname",
                    Password = "pword",
                    First_Name = "fname",
                    Last_Name = "sname",
                    Emails = new[]
                    {
                        new Email { Address = "email1@domain.tld" },
                        new Email { Address = "email2@domain.tld" },
                    }
        }
    };

    Users.ForEach(u => context.Users.Add(u));
}

Чтобы добавить электронное письмо ранее созданному пользователю, сначала необходимо указать ссылку на пользователя:

var user = Users.First();
user.Emails.Add(new Email { Address = "email3@domain.tld" });

Ответ на комментарий:

new[] - сокращение от new Email[] (новый массив электронной почты).

Технически ответ Эранги немного более гибкий.В моем случае, поскольку массивы имеют фиксированную длину, вы не можете добавить Email в коллекцию Emails после того, как она была инициализирована как массив.Вам нужно будет либо использовать List<Email> как в ответе Eranga, либо преобразовать в список, подобный этому, прежде чем вызывать .Add():

user.Emails.ToList().Add(new Email { Address = "email3@domain.tld" });

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

Тем не менее, после того, как вы сохраните User и вернете его из базы данных, ваше свойство Emails collection будет не массивом фиксированной длины и может быть добавленобез необходимости вызывать .ToList().

...