繁体   English   中英

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

[英]Multiple tables containing one entity in 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; }
}

问题是,该实体现在在产品到交易中进行FK。 那不是我想要的。 我要为每个人准备一张单独的桌子。 产品表和SoldProducts表。 我已经在我的productContext中尝试过此操作:

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

这是不可能的,因为EF不允许每个类型使用多个对象集。 这似乎有些琐碎,但我无法弄清楚。 将两个类别(一个产品和一个已售产品)都具有产品类型的子类,看起来很丑。 我试过了,但是VS2012抱怨说它不能将Product转换成SoldProduct。

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

我假设您正在使用EF Code First。 当您在“交易”表中有一个产品集合时,EF会将其视为典型的一对多关系。

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

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

更新以回应评论:

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

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

使用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());

}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM