Я создал сообщение с проблемой и другой проблемой .Их можно посмотреть на предмет ссылок, но я считаю их обработанными.
Мой вопрос, возникающий из-за этих проблем, и действия, которые я (нужно или не нужно) применять, беспокоит меня, потому что я не совсем понимаю 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 экземпляр содержал отношение Цена-Поставщик-Продукт-Контракт, как мне это сделать? Ответ здесь