我知道还有其他一些问题 - 但我无法让他们解决我的问题。
我有以下课程:
public class Category
{
public Category()
{
Products = new List<Product>();
}
public int Id { get; set; }
public string Name { get; set; }
public List<Product> Products { get; set; }
public override string ToString()
{
return String.Format("{0}{1}", Id, Name);
}
}
和
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public Category Category { get; set; }
public override string ToString()
{
return String.Format("{0}{1}", Id, Name);
}
}
我有一些代码试图更新产品及其类别:
using (var ctx = GetCtx())
{
var beverages = new Category {Id = 1 };
var milk = new Product { Name = "MILK", Id = 4, Category = new Category { Id = 1} };
ctx.Entry(milk).State = System.Data.EntityState.Modified;
ctx.SaveChanges();
}
这导致以下sql语句:
update [dbo].[Products]
set [Name] = @0, [Price] = @1
where ([Id] = @2)
@0: MILK
@1: 0
@2: 4
我无法弄清楚如何确保更新特定产品的类别。我考虑过将一个属性添加到Product for Category_Id,但这会导致在我的数据库中生成一个额外的列。
编辑: 在我看完Julia Lerman关于EF(Pluralsight)的系列剧之后,我想我想出来了 - 设置这个课程的方式是这样的:
public class Product
{
public int Id { get; set; }
[Required]
[MaxLength(200)]
public string Name { get; set; }
public virtual Category Category { get; set; }
public int CategoryId { get; set; }
}
这导致Products表中只有一个外键列。更新CategoryId属性时,产品的类别会更新。
答案 0 :(得分:0)
你必须完成两项工作,所以要在两项工作中完成......
var cat = ctx.Categories.FirstOrDefault(c=>c.Id == 1);
if(cat == null){
cat = new Category{Id=1};
ctx.Categies.Add(cat);
}
cat.Products.Add(new Product{Name="Milk", Id=4};
try{
ctx.SaveChanges();
}catch(Exception ex){
return RedirectToResponse("someone else got in first with that category Id");
}