[英]Entity Framework 1 to Many creates new objects
我正在為我的Microsoft Sql數據庫使用EntityFramework。 第一個實體是Product :
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; }
}
因此,一個產品可能在鬃毛產品 故事中 ,也可能不在。
我不會顯示所有代碼(太大),因此當我第一次創建一個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");
}
}
您的代碼中有一些錯誤:
//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
。
解決方案是關於實體框架“錯誤/功能”。 當我向數據庫中添加新的ProductStory
,它將附加整個圖(包括所有其他實體引用並重新創建它們)。 因此,在提交新的ProductStory
之前,我必須將其所有導航屬性設置為null以避免重新創建。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.