Отношение один к одному Seed ASP .NET MVC - PullRequest
0 голосов
/ 23 октября 2018

Я создаю веб-приложение с использованием ASP .NET MVC5 и EF6.

Я пытаюсь вставить данные в отношение «один к одному», определенное так:

Models

public class Client 
{
  public int ClientId { get; set; }  
  [Required]
  public string Name { get; set; }

  public Address Address { get; set; }
}

public class Address 
{
  [ForeignKey("Client")]
  public int AddressId { get; set; }  
  [Required]
  public string StreetName { get; set; }

  public Client Client { get; set; }
}

Где Address является зависимым концом.

Теперь я хочу заполнить эти две таблицы, используя EF и в / Migrations / Configuration.cs Я добавил следующий код:

internal sealed class Configuration : DbMigrationsConfiguration<MR_TrackTrace.Models.ApplicationDbContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(MR_TrackTrace.Models.ApplicationDbContext context)
        {

            var clients = new List<Client>
            {
                new Client { Name = "John" },
                new Client { Name = "Mary" },
                new Client { Name = "Philip" }
            };

            clients.ForEach(s => context.Clients.AddOrUpdate(p => p.Name, s));

            context.SaveChanges();
            var addresses = new List<Address>
            {
                new Address { StreetName = "something", Client = clients.FirstOrDefault(s => s.Name == "John") },
                new Address { StreetName = "other", Client = clients.FirstOrDefault(s => s.Name == "Philip") },
                new Address { StreetName = "another", Client = clients.FirstOrDefault(s => s.Name == "Mary") }
            };

            addresses.ForEach(s => context.Addresses.AddOrUpdate(p => p.Name, s));
            context.SaveChanges();
        }
 }

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

Но этот столбец не заполнен ожидаемым идентификатором, вместо этого он заполнен "0".Используя:

Client = clients.FirstOrDefault(s => s.Name == "John")

Я ожидал, что контекст автоматически установит ClientId для этой таблицы.

Может кто-нибудь помочь мне направить меня через эту проблему?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Решил мою проблему путем заполнения следующим образом:

 protected override void Seed(MR_TrackTrace.Models.ApplicationDbContext context)
        {

            var clients = new List<Client>
            {
                new Client { Name = "John" },
                new Client { Name = "Mary" },
                new Client { Name = "Philip" }
            };

            clients.ForEach(s => context.Clients.AddOrUpdate(p => p.Name, s));

            context.SaveChanges();
            var addresses = new List<Address>
            {
                new Address { StreetName = "something", ClientId = context.Clients.FirstOrDefault(s => s.Name == "John").ClientId },
                new Address { StreetName = "other", ClientId = context.Clients.FirstOrDefault(s => s.Name == "Philip").ClientId },
                new Address { StreetName = "another", ClientId = context.Clients.FirstOrDefault(s => s.Name == "Mary").ClientId }
            };

            addresses.ForEach(s => context.Addresses.AddOrUpdate(p => p.Name, s));
            context.SaveChanges();
        }

Все еще не знаю, почему EF не удалось связать две таблицы и автоматически заполнить ClientId в таблице адресов.

Спасибо!

0 голосов
/ 23 октября 2018

Вы не можете добавить адрес следующим образом:

var clients = new List<Client>
{
    new Client { Name = "John", Address = new Address() { StreetName = "Something" } },
    new Client { Name = "Mary", Address = new Address() { StreetName = "Other" }  },
    new Client { Name = "Philip", Address = new Address() { StreetName = "Another" }  }
};

Когда он сохраняет изменения, он должен одновременно создать клиента и адрес и связать их вместе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...