C# Faker Bogus создает собственность
Я пытаюсь поиграть с библиотекой Bogus для генерации случайных начальных данных в приложении.Net Core 2.1, используя EF Core для управления данными.
У меня есть объект под названием Company, которому принадлежит Address; это отношения один-к-одному.
Модель компании:
public class Company
{
public long Id { get; set; }
[Required]
public Address Address { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public string Website { get; set; }
}
Модель адреса:
public class Address : IValidatableObject
{
public long Id { get; set; }
public string Street1 { get; set; }
public string Street2 { get; set; }
public string ZipCode { get; set; }
public string City { get; set; }
public string Country { get; set; }
}
Код заполнения доступен в моем DbContext:
var TestAddresses = new Faker<Address>()
.RuleFor(o => o.Id, f => aId++)
.RuleFor(o => o.Street1, f => f.Address.StreetAddress(true))
.RuleFor(o => o.Country, f => f.Address.Country())
.RuleFor(o => o.City, f => f.Address.City());
var c = new Faker<Company>()
.RuleFor(o => o.Id, f => f.IndexFaker+1)
.RuleFor(o => o.RegisteredAddress, f => TestAddresses.Generate())
.RuleFor(o => o.Phone, f => f.Phone.ToString())
.RuleFor(o => o.Email, f => f.Internet.Email())
.FinishWith((f, u) =>
{
Console.WriteLine("Company created! Id = {0}", u.Id);
});
b.Entity<Company>().HasData(c.Generate(100).ToArray());
При выполнении кода я получаю следующее исключение:System.InvalidOperationException: "Начальный объект для типа объекта" Компания "не может быть добавлен, потому что не было предоставлено значение для обязательного свойства RegisteredAddressId".
1 ответ
Вы должны указать значение для RegisteredAddressId
при заполнении вы не можете зависеть от автогенерации вашей базой данных здесь. См. https://github.com/aspnet/EntityFrameworkCore/issues/11776:
Просто чтобы понять, почему сгенерированные в магазине значения не поддерживаются здесь. Идея наличия данных в модели состоит в том, что когда модель развивается, начальные данные в базе данных развиваются вместе с ней. Но чтобы это работало, каждый объект в модели должен иметь хорошо известное значение ключа, чтобы его можно было найти и обновить позже. Не стесняйтесь использовать более традиционные механизмы заполнения, например, для тестов, которым просто нужно инициализировать некоторые данные в пустую базу данных.