Entity Framework не создает отношения сущностей - PullRequest
0 голосов
/ 25 мая 2020

Поскольку я пытаюсь разобраться с Entity Framework code-first и как устанавливать отношения между сущностями. Я столкнулся с проблемой, когда пытался вставить (заполнить) некоторые данные в свою базу данных. Я пытаюсь вставить объект продукта внутрь объекта покупок (заказа). Это свойство продукта в покупках является виртуальным, чтобы указать, что это свойство навигации. Есть ли другой способ достичь того, чего я хотел? добавлено, потому что для него настроена навигация «Клиент». Чтобы заполнить отношения, вам необходимо добавить начальное значение связанной сущности в «Клиент» и указать значения внешнего ключа {'customerID'}. Рассмотрите возможность использования DbContextOptionsBuilder.EnableSensitiveDataLogging для просмотра значений задействованных свойств.

Ниже приведен метод заполнения, который выполняется в классе контекста данных.

private void SeedDatabase(ModelBuilder builder)
{
        // Construct Data
        var productType = new ProductType()
        {
            typeName = "Operating System"
        };

        var product = new Product()
        {
            typeID = productType.typeID,
            productName = "Windows",
            productVersion = "10 Home",
            productDescription = "This version of windows is the Home 10 edition",
            keyPrice = 10,
            license = "ASDEW-2342-SDE34-FGR35",
            ProductType = productType
        };

        var customer = new Customer()
        {
            customerEmail = "test-customer@gmail.com",
            customerFullname = "John Derek"
        };

        var transaction = new Transaction()
        {
            paid = true,
            transactionAmount = 10
        };

        var order = new Buys()
        {
            customerID = customer.customerID,
            TransactionID = transaction.transcationID,
            quantity = 1,
            Date = new DateTime().Date,
            Transaction = transaction,
            Customer = customer,
            Product = product,
            productID = product.productID
        };

        transaction.Buy = order;
        System.Collections.Generic.List<Buys> orders = new System.Collections.Generic.List<Buys>() { order };
        product.customerBuys = orders;

        builder.Entity<ProductType>()
            .HasData(productType);

        builder.Entity<Product>()
           .HasData(product);

        builder.Entity<Customer>()
           .HasData(customer);

        builder.Entity<Transaction>()
           .HasData(transaction);

        builder.Entity<Buys>()
           .HasData(orders);
    }

И вот две модели это упоминание о.

public class Customer
{
    public Customer()
    {
        customerID = Guid.NewGuid().ToString();
    }

    [Key]
    public string customerID { get; set; }
    public string customerFullname { get; set; }
    public string customerEmail { get; set; }
    public virtual ICollection<Buys> customerBuys { get; set; }
}

// This is a join table between product and customer.
// Product can have many customers
// One customer can purchase many products
public class Buys
{
    public Buys()
    {
        buyID = Guid.NewGuid().ToString();
    }

    [Key]
    public string buyID { get; set; }
    public string productID { get; set; }
    public virtual Product Product { get; set; }
    public string customerID { get; set; }
    public virtual Customer Customer { get; set; }
    public int quantity { get; set; }
    public DateTime Date { get; set; }
    public string TransactionID { get; set; }
    public virtual Transaction Transaction { get; set; }
}

1 Ответ

0 голосов
/ 31 мая 2020

Поля Id представляют собой строки, и вы их нигде не заполняете. Попробуйте заполнить эти идентификаторы перед передачей объекта в HasData ().

Пример:

var productType = new ProductType()
{
    Id = Guid.NewGuid().ToString(), //If they are supposed to be GUIDs
    typeName = "Operating System"
};
...