繁体   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