Связи сопоставления базы данных Entity Framework (создание дубликата с использованием метода Seed ()) - PullRequest
0 голосов
/ 11 декабря 2018

Я создал сообщение с проблемой и другой проблемой .Их можно посмотреть на предмет ссылок, но я считаю их обработанными.

Мой вопрос, возникающий из-за этих проблем, и действия, которые я (нужно или не нужно) применять, беспокоит меня, потому что я не совсем понимаю EF его поведениеи ожидания.

У меня есть сущность Product, PurchasePrice и SalesPrice, где я изначально думал, что 1 Product может иметь несколько PurchasePrices, но что 1 PurchasePrice может существовать только в 1 Product (то же самое для SalesPrice).

Таким образом, эти отношения:

// NOTE that BaseEntity just has a "int ID" prop and datetimes/stamps
public class Product : BaseEntity
{
   public  ICollection<PurchasePrice> PurchasePrices { get; set; }
   public  ICollection<PurchasePrice> SalesPrices { get; set; }
}

public  class PurchasePrice:BaseEntity
{      
   public Product Product { get; set; }
}

public  class SalesPrice:BaseEntity
{      
   public Product Product { get; set; }
}

Теперь давайте добавим к нему объект поставщика, потому что именно поэтому я разделяю отделы продаж и закупок и не создаюПеречислим это, потому что 1 Продукт (в базе данных) может иметь несколько поставщиков, каждый из которых имеет свои собственные цены Продажи / Покупки И другое значение ProductNumber.

Таким образом, выше становится:

public class Product : BaseEntity
{
   public  ICollection<PurchasePrice> PurchasePrices { get; set; }
   public  ICollection<PurchasePrice> SalesPrices { get; set; }
   // added
   public  ICollection<Supplier> Suppliers { get; set; }
}

public  class PurchasePrice:BaseEntity
{      
   public Product Product { get; set; }
   // added
   public Supplier Supplier { get; set; }
}

public  class SalesPrice:BaseEntity
{      
   public Product Product { get; set; }
   // added
   public Supplier Supplier { get; set; }
}

// added Entity Supplier into the party
public class Supplier : BaseEntity
{
    public ICollection<Product> Products { get; set; }
    public ICollection<PurchasePrice> PurchasePrices { get; set; }
    public ICollection<SalesPrice> SalesPrices { get; set; }
}

Давайте продолжим немного дальше, потому что это не останавливается на достигнутом, я хочу отслеживать эти отношения Продукт-Поставщик-Цены, поэтому я создал сущность с именем ' ProductSupplierForContract ', которая будет иметь следующую структуру:

public class ProductSupplierForContract:BaseEntity
{
    public string ProductnumberValue { get; set; }

    public int Product_Id { get; set; }
    public int Supplier_Id { get; set; }
    public int? Contract_Id { get; set; }

    public virtual Product Product { get; set; }
    public virtual Supplier Supplier { get; set; }
    public virtual Contract Contract { get; set; }
}

Наконец, у меня есть Контракт Сущность, которая имеет следующую структуру:

public class Contract:BaseEntity
{
  [Required]
  public ICollection<Product> Products { get; set; }
  public ICollection<ProductSupplierForContract> ProductSupplierForContracts { get; set; }
}

Итакстановится:

public class Product : BaseEntity
{
   public  ICollection<PurchasePrice> PurchasePrices { get; set; }
   public  ICollection<PurchasePrice> SalesPrices { get; set; }    
   public  ICollection<Supplier> Suppliers { get; set; }
   // added
   public  ICollection<Contract> Contracts { get; set; }
}   

Custom Seeding (наследуется от DropCreateDatabaseAlways):

protected override void Seed(ApplicationDbContext context)
{
   PurchasePrice purchaseprice = new PurchasePrice((decimal)17.70);
   ctx.PurchasePrices.Add(purchaseprice);

   Product product1 = new Product("test product 1",purchaseprice);
   ctx.Products.Add(product1);

   base.Seed(ctx);
}

У меня также есть определения, определенные в Fluent API:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
         // setting the Product FK relation required + related entity
        modelBuilder.Entity<Entity.ProductSupplierForContract>().HasRequired(psfc => psfc.Product)
                                                            .WithMany(p => p.ProductSupplierForContracts)
                                                            .HasForeignKey(psfc => psfc.Product_Id);

        // setting the Supplier FK relation required + related entity
        modelBuilder.Entity<Entity.ProductSupplierForContract>().HasRequired(psfc => psfc.Supplier)
                                                           .WithMany(s => s.ProductSupplierForContracts)
                                                           .HasForeignKey(psfc => psfc.Supplier_Id);

        // setting the Contract FK relation required + related entity
        modelBuilder.Entity<Entity.ProductSupplierForContract>().HasOptional(psfc => psfc.Contract)
                                                          .WithMany(c => c.ProductSupplierForContracts)
                                                          .HasForeignKey(psfc => psfc.Contract_Id);

    }

Итак, изначально я сделалУ меня не было никаких проблем, и я действительно не понимаю, что привело к такому внезапному изменению, которое я теперь получил дубликаты продуктов, когда я заполняю свою базу данных.Я могу ограничить это простым добавлением простого PurchasePrice со значением и Product, имеющего ссылку на этот PurchasePrice, и есть мой дубликат.

Изменение отношения внутри класса PurchasePrice продукта Entity к ICollectionне создает дубликат, но я не хочу эту коллекцию, потому что это не отношение ко многим ...

Я перепробовал огромное количество вещей, но ничего, что "решило" это (если этопроблема для начала, для меня да, но, может быть, не для EF), как удаление наследования BaseEntity, изменение отображения (Fluent AND аннотации), изменило способ, которым я сеял и инициализировал все, определяя идентификаторы себя, вы называете это ...

Имейте в виду, что цель состоит не в том, чтобы оптимизировать способ, которым я сею в любом случае, а в том, чтобы иметь достойно работающую Модель И понять, что EF делает и чего хочет.

Мои вопросы:

  • Почему этот дубликат встречается / появляется?
  • Если я хочу, чтобы 1 экземпляр содержал отношение Цена-Поставщик-Продукт-Контракт, как мне это сделать? Ответ здесь

1 Ответ

0 голосов
/ 14 декабря 2018

Я исправил свою проблему, перепроектировав модель.Я добавил дополнительную сущность ProductForSupplier , которая содержит отношение Product & Supplier и Productnumber.

public class ProductForSupplier:BaseEntity
{
    public string ProductnumberValue { get; set; }

    [Required]
    public Product Product { get; set; }

    [Required]
    public Supplier Supplier { get; set; }
}

Добавлена ​​сущность ProductsForContract , которая будет содержать сумму отношения Продукт-Поставщик для 1 контракта:

public class ProductsForContract
{
    public int ProductsForContractId { get; set; }        
    public int Amount { get; set; }
    public ProductForSupplier ProductForSupplier { get; set; }
    public Contract Contract { get; set; }
}

И Существующую сущность ProductSupplierForContract становится:

public class ProductSupplierForContract:BaseEntity
{
    public ICollection<ProductsForContract> ProductsForContract { get; set; }

    [Required]
    public Contract Contract { get; set; }
}

. Это дает мне гибкость, чтобы сохранять отношения любого рода между сущностями, а также позаботился о дубликате (который я до сих пор не знаю причину).

...