Entity framework 为什么实体框架先编码一对多不';我不能正常工作
我有两张分类表和产品表。我已经在分类表中输入了一些数据,之后我想根据所选的分类添加一些产品。当我尝试添加产品时,它不会保存产品数据。这是我为更新或向Product表追加行而编写的函数Entity framework 为什么实体框架先编码一对多不';我不能正常工作,entity-framework,linq,code-first,Entity Framework,Linq,Code First,我有两张分类表和产品表。我已经在分类表中输入了一些数据,之后我想根据所选的分类添加一些产品。当我尝试添加产品时,它不会保存产品数据。这是我为更新或向Product表追加行而编写的函数 public void write(string Name, string Code, decimal Price, string Image, Category Category,string Description) { using (var x =
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; }
}
公共类产品
{
公共产品()
{
this.order=new HashSet();
}
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
公共Int32 ID{get;set;}
公共字符串PName{get;set;}
公共字符串代码{get;set;}
公共十进制价格{get;set;}
公共字符串图像{get;set;}
公共字符串说明{get;set;}
公共Int32类别ID{get;set;}
[外国钥匙(“类别”)]
公共类别{get;set;}
公共虚拟ICollection顺序{get;set;}
}
公共类类别
{
公共类别()
{
this.product=new HashSet();
}
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
公共Int32 ID{get;set;}
[索引(IsUnique=true)]
[必需,最大长度(50),最小长度(1)]
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共字符串图像{get;set;}
公共虚拟ICollection产品{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);
}
}
公共类MyDB:DbContext
{
公共MyDB()
:base(“name=MyDB”)
{
SetInitializer(新的MigrateDatabaseToLatestVersion(“MyDB”);
}
公共虚拟数据库集类别{get;set;}
公共虚拟数据库集产品{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
}
}
有人能帮我解决这个问题吗?谢谢首先,您必须修改您的模型,如下所示
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; }
}
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();
}
}
首先,您必须修改您的模型,如下所示
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; }
}
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”的未经处理的异常。其他信息:entity对象不能被多个IEntityChangeTracker实例引用。您能在更改后显示您的
保存
零件吗(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约定修改代码后,仍然存在问题,请与我联系。我将帮助您。首先,您必须修改代码根据约定创建。这是必须的。以下是教程:感谢您的快速回答!但是当我根据您的修改运行代码时,我得到了以下信息:EntityFramework.dll中发生了类型为“System.InvalidOperationException”的未经处理的异常。其他信息:实体对象不能被多个实例引用使用(var x=new MyDB()){Product pro=new 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约定修改代码后,仍然存在问题,请与我联系。我将帮助您。首先,您必须修改代码根据惯例创建基础。这是必须的。以下是教程: