1

我正在开发一个销售产品的系统。这个系统有产品,每个产品类型都有子类。

public abstract class Product 
{
    public int ProductId { get; set; }
    public string naam { get; set; }
    public string barcode { get; set; }
}

public class Card :Product
{
    [Display(Name = "Cardnumber")]
    public int nummer { get; set; }
    public Kaliber kaliber { get; set; }
}

此外,我想保留我销售的所有产品的历史记录以及当时正确的所有数据。

 public class Transaction
{
    public int transactionId { get; set; }
    public Member member { get; set; }
    public virtual ICollection<Product> producten { get; set; }
    public double totaalprijs { get; set; }
    public DateTime tijdstip { get; set; }
    public string kantoorMedewerker { get; set; }
}

问题是,该实体现在在 Product to Transaction 中创建了 FK。那不是我想要的。我想为他们每个人准备一张单独的桌子;一个产品表和一个已售产品表。我已经在我的 productContext 中尝试过这个:

public DbSet<Product> producten { get; set; }
public DbSet<Product> uitgifte_producten { get; set; }

这是不可能的,因为 EF 不允许每个 type 有多个对象集。这似乎是微不足道的,但我无法弄清楚。制作两个类,一个 Product 和一个 Soldproduct,它们都有 producttypes 的子类,看起来相当难看。我试过了,但是 VS2012 抱怨它不能将 Product 转换为 SoldProduct。

在 C#、.net 4.0 和 EF 中执行此操作似乎是个好主意?

4

3 回答 3

1

我假设您使用的是 EF Code First。当您的 Transactions 表中有一系列产品时,EF 会将其视为典型的一对多关系。

我将添加一个 TransactionDetail 表,我将从 Product 中复制我需要的所有详细信息:

 public class TransactionDetail{
     public int TransactionId { get; set; }
     public int ProductId { get; set; }
     public string naam { get; set; }
     public string barcode { get; set; }
}

更新以回应评论:

仍然假设您使用代码优先。在您的场景中,您可以使用上面的 TransactionDetail 类作为基类,然后在产品类型方面拥有更多派生类。您将能够捕获每个产品所需的所有详细信息,并且您的数据库中将只有一个额外的表。

于 2013-05-22T02:41:06.173 回答
1

为什么不使用基本的多对多关系链接到交易类中的产品?

使用 EF Fluent API,您可以添加具有以下内容的配置类:

public class TransactionConfig : EntityTypeConfiguration<Transaction>
{
    public TransactionConfig ()
    {
        this.HasMany(t => t.Products)
            .WithMany()
            .Map(x =>
            {
                x.MapLeftKey("TransactionId");
                x.MapRightKey("ProductId");
                x.ToTable("TransactionProducts");
            });
    }
}

然后,使用以下命令覆盖 DbContext 的 OnModelCreating 函数:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Configurations.Add(new TransactionConfig());

}
于 2013-05-22T11:01:23.970 回答
0

我不知道有什么方法可以在 EF 中做这样的事情。

如果您真的想保留每笔交易的所有产品数据,我建议为每笔交易创建产品副本,然后将它们存储在数据库中并从交易中引用它们。您可能还考虑在产品上创建一个自我引用,然后它可以指向“交易产品”的“实际产品”。

我能想到的另一种方法是存储产品历史记录而不是创建产品副本,即在产品更改而不是交易创建时创建产品副本。这样,在创建交易时,您始终链接到产品的当前版本。

于 2013-05-22T00:41:06.463 回答