EF 5.0外键未更新

时间:2013-11-29 23:49:48

标签: ef-code-first entity-framework-5 foreign-key-relationship

我知道还有其他一些问题 - 但我无法让他们解决我的问题。

我有以下课程:

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属性时,产品的类别会更新。

1 个答案:

答案 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");
}