我正在研究销售产品的系统。该系统具有产品,每种产品类型都有子类。
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中执行此操作似乎是个好主意?
答案 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中做这样的事情。
如果您真的想保留每笔交易的所有产品数据,我建议为每笔交易创建产品副本,然后将它们存储在数据库中并从交易中引用它们。您也可以考虑在产品上创建自引用,然后可以指向“交易产品”的“实际产品”。
我能想到的另一种方法是存储产品历史记录而不是创建产品的副本,即在产品更改而不是创建事务时创建产品副本。这样,在创建交易时,您始终会链接到产品的当前版本。