实体框架中包含一个实体的多个表

时间:2013-05-22 00:10:01

标签: c# .net entity-framework

我正在研究销售产品的系统。该系统具有产品,每种产品类型都有子类。

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。那不是我想要的。我想为他们每个人分开一张桌子; Products表和SoldProducts表。 我已经在productContext中试过了这个:

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

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

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

3 个答案:

答案 0 :(得分:1)

我假设您使用的是EF Code First。 如果在“交易”表格中有一组产品,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类作为基类,然后在产品类型方面拥有更多派生类。您将能够捕获每个产品所需的所有详细信息,并且您的数据库中只会有一个额外的表。

答案 1 :(得分: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());

}

答案 2 :(得分:0)

我不知道如何在EF中做这样的事情。

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

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

相关问题