【问题标题】:Why Entity Framework Code First one to many Doesn't work properly为什么实体框架代码第一个一对多不能正常工作
【发布时间】:2016-09-04 09:17:44
【问题描述】:

我有两个表类别和产品。我已经在类别表中输入了一些数据,然后我想根据所选类别添加一些产品。当我尝试添加产品时,它不会保存产品数据。这是我为更新或追加行到 Product 表而编写的函数

public  void write(string Name, string Code, decimal Price,
                   string Image, Category Category,string Description)
    {
       using (var x = new MyDB())
      {
            Product pro = new Product
            {
                category = Category,
                CategoryID=Category.ID,
                PName = Name,
                Code = Code,
                Image = Image,
                Description = Description,
                Price = Price
            };     
            var row = x.categorys.Find(Category.ID);
            Category.product.Add(pro); 
            x.Entry(row).CurrentValues.SetValues(Category);
            x.SaveChanges();





        }
    }

这也是我拥有的表格:

 public class Product
{
 public Product()
    {
        this.order = new HashSet<Order>();
    }
    [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Int32 ID { get; set; }
    public string PName { get; set; }
    public string Code { get; set; }
    public decimal Price { get; set; }
    public string Image { get; set; }
    public string Description { get; set; }
    public Int32 CategoryID { get; set; }
    [ForeignKey("CategoryID")]
    public Category category { get; set; }
    public virtual ICollection<Order> order { get; set; }


}
public class Category
{
    public Category()
    {
        this.product = new HashSet<Product>();
    }
    [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Int32 ID { get; set; }
    [Index(IsUnique =true)]
    [Required, MaxLength(50), MinLength(1)]
    public string Name { get; set; }
    public string Description { get; set; }
    public string Image { get; set; }
    public virtual ICollection<Product> product { get; set; }
}

这是我的 DbContext

public class MyDB : DbContext
{

    public MyDB()
        : base("name=MyDB")
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDB, coffeeshopapp.Migrations.Configuration>("MyDB"));
    }


    public virtual DbSet<Category> categorys { get; set; }

    public virtual DbSet<Product> products { get; set; }


    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

    }
}

有人可以帮我解决这个问题吗?谢谢

【问题讨论】:

    标签: entity-framework linq code-first


    【解决方案1】:

    首先你必须修改你的模型,如下所示。

    public class Product
    {
    
      public Product()
        {
            this.order = new HashSet<Order>();
        }
    
        [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Int32 ID { get; set; }
    
        public string PName { get; set; }
        public string Code { get; set; }
        public decimal Price { get; set; }
        public string Image { get; set; }
        public string Description { get; set; }
    
        [ForeignKey("CategoryID")]
        public virtual Category Category { get; set; }
        public Int32 CategoryID { get; set; }
    
        public virtual ICollection<Order> Orders { get; set; }
    
    
    }
    
    public class Category
    {
        public Category()
        {
            this.product = new HashSet<Product>();
        }
    
        [Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Int32 ID { get; set; }
    
        [Index(IsUnique =true)]
        [Required, MaxLength(50), MinLength(1)]
        public string Name { get; set; }
    
        public string Description { get; set; }
        public string Image { get; set; }
    
        public virtual ICollection<Product> Products { get; set; }
    }
    

    之后Save如下图。

    public  void write(string Name, string Code, decimal Price,
                       string Image, Category Category,string Description)
        {
           using (var x = new MyDB())
          {
                Product pro = new Product
                {
                    Category = Category,
                    PName = Name,
                    Code = Code,
                    Image = Image,
                    Description = Description,
                    Price = Price
                };     
    
               x.Products.Add(pro);
               x.SaveChanges();
    
            }
        }
    

    【讨论】:

    • 感谢您的快速回答!但是当我根据您的修改运行代码时,我得到了这个: EntityFramework.dll 中发生了“System.InvalidOperationException”类型的未处理异常附加信息:IEntityChangeTracker 的多个实例无法引用实体对象。
    • 你能告诉我你的saving 修改后的部分吗?
    • 'using (var x = new MyDB()) { Product pro = new Product { Category = Category, PName = Name, Code = Code, Image = Image, Description = Description, Price = Price } ; x.products.Add(pro); x.SaveChanges(); }'
    • 这里似乎是小写的x.products ?是错字吗?
    • 好的,如果你按照这个EF教程,我很确定你可以解决上面的基本问题。按照教程并根据code first conventions修改代码后,仍然有问题请联系我,我会帮你的。首先你必须根据约定修改你的代码库。这是必须的。这里是教程:entityframeworktutorial.net/code-first/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2019-06-10
    相关资源
    最近更新 更多