簡體   English   中英

實體框架一對多創建新對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM