我正在为我的Microsoft Sql数据库使用EntityFramework。 第一个实体是产品:
public class Product
{
public Product()
{
ProductStories = new HashSet<ProductStory>();
}
public int ProductId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public bool Deleted { get; set; }
public HashSet<ProductStory> ProductStories { get; set; }
}
另一个实体是 ProductStory ,它存储有关产品的收入或结果的故事。
public class ProductStory
{
public int ProductStoryId { get; set; }
public virtual Product.Product Product { get; set; }
public int Count { get; set; }
public DateTime DateTime { get; set; }
}
因此,一个产品可能位于鬃毛 ProductStories 中,或者没有。
我不会显示所有代码(太大),所以当我首先创建一个 Product 实例并将其保存在DB中时。然后,我创建一个 ProductStory ,并将属性Product引用到该Product实例。 然后我保存了 ProductStory ,变成了2个 ProductStory 的实例。 在我阅读时,我把它作为虚拟财产:
public virtual Product.Product Product { get; set; }
如何解决这个问题?
我正在使用EntityTypeConfiguration
进行表格配置。
public class ProductMap : EntityTypeConfiguration<Product>
{
public ProductMap()
{
ToTable("Products").HasKey(x => x.ProductId);
Property(x => x.ProductId).IsRequired();
Property(x => x.Name).IsRequired().HasMaxLength(255).HasColumnName("Name");
//.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_Name") { IsUnique = true }));
Property(x => x.Description).IsOptional().HasColumnName("Description");
Property(x => x.Deleted).HasColumnName("Deleted");
}
}
对于ProductStory:
class ProductStoryMap: EntityTypeConfiguration<ProductStory>
{
public ProductStoryMap()
{
ToTable("ProductStories").HasKey(ps => ps.ProductStoryId);
Property(ps => ps.ProductStoryId).IsRequired();
//Property(ps => ps.ProductId).IsRequired().HasColumnName("ProductId");
Property(ps => ps.Count).HasColumnName("Count");
Property(ps => ps.DateTime).HasColumnName("DateTime");
}
}
答案 0 :(得分:1)
您的代码中存在一些错误:
//Change this:
public HashSet<ProductStory> ProductStories { get; set; }
//For this (virtual is needed here, also use ICollection rather than any specific implementation)
public virtual ICollection<ProductStory> ProductStories { get; set; }
//Change this:
public virtual Product.Product Product { get; set; }
//For this (virtual makes no sense here)
public Product.Product Product { get; set; }
最后,ProductStory
需要一种方法来保持对其父Product
的引用。这是在数据库中创建外键关系并允许实体框架链接表的原因。所以将其添加到ProductStory
:
public int ProductId { get; set; }
如果您仍然收到重复的对象(可能会发生),请确保将ProductId
设置为您要保存的ProductStory
。
答案 1 :(得分:0)
解决方案是关于实体框架“bug / feature”。
当我在DataBase中添加新的ProductStory
时,它会附加整个图形(包括所有其他实体引用和重新创建它们)。
因此,在提交新的ProductStory
之前,我必须将其所有导航属性设置为null以避免重新创建。