无法在实体框架中插入具有一对多关系的记录

时间:2015-12-16 19:50:29

标签: c# entity-framework

我正在使用WinForms和Code First学习C#和Entity Framework。我试图将记录插入数据库,但我没有太多运气。问题与FK值有关。我的产品型号如下:

public class Product
{
    [Key]
    public int ID { get; set; }

    [Required]
    [StringLength( 50 )]
    public string ProductCode { get; set; }

    [Required]
    [StringLength( 300 )]
    public string Description { get; set; }

    public virtual Category Category { get; set; }

    public virtual SubCategory SubCategory { get; set; }

    public int ReorderLevel { get; set; }

    public int TargetStockLevel { get; set; }

    [Required]
    public double Cost { get; set; } 

    [StringLength( 400 )]
    public string Note { get; set; }

    public bool Active { get; set; }

    public DateTime CreateDate { get; set; }

    public DateTime LastEdited { get; set; }
}

每个产品属于一个类别和子类别:

public class Category
{
    [Key]
    public int ID { get; set; }

    [Required]
    public string CategoryName { get; set; }

    public virtual ICollection<Product> Products { get; set; }

    public virtual ICollection<SubCategory> SubCategories { get; set; }
}

public class SubCategory
{
    [Key]
    public int ID { get; set; }

    public virtual Category Category { get; set; }

    [Required]
    public string SubCategoryName { get; set; }
}

当用户点击&#34;保存&#34;按钮,执行以下代码:

    // Create a new product
    var product = new Product();
    product.ProductCode = txtProductCode.Text;
    product.Description = txtDescription.Text;
    product.Category = int.Parse( cmboCategory.SelectedValue.ToString() ); // Error Here so the rest fails
    //product.Category.ID = int.Parse( cmboCategory.SelectedValue.ToString() ); I tried this also...
    product.SubCategory.ID = int.Parse( cmboSubCategory.SelectedValue.ToString() );
    product.ReorderLevel = int.Parse( txtReorderLevel.Text );
    product.TargetStockLevel = int.Parse( txtTargetStock.Text );
    product.Pieces = int.Parse( txtPieces.Text );
    product.Cost = double.Parse( txtCost.Text );
    product.Note = txtNotes.Text;
    product.Active = true;
    product.CreateDate = DateTime.Now;
    product.LastEdited = DateTime.Now;

    // Create the new Product
    using ( var db = new InventoryContext() )
    {
        db.Products.Add( product );
        db.SaveChanges();
    }

如上面的代码高于VS,则会出错:

"Cannot implicitly convert type 'int' to 'InventoryTracker.DataModels.Category'"

我知道这必须简单,我只是没有得到它而且我的Google-fu今天让我失望了。我做错了什么?

1 个答案:

答案 0 :(得分:0)

Category不是外键。是导航属性。它就是那样你可以把它当作一个典型的物体来对待,而EF则为你付出了艰苦的努力。它实际上并不存在于您的产品表中。

相反,实体框架会添加它自己的int值(Category_ID),这是对类别表的外键引用。

如果您想直接设置外键,我会像这样声明using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; ... [ForeignKey("Category")] public int CategoryId { get; set; } public virtual Category Category { get; set; }

product.CategoryId = int.Parse( cmboCategory.SelectedValue.ToString() );

这样,如果你想设置你的id,你可以这样设置

public ActionResult Details(string item)
    {

        var verbiage = HttpUtility.HtmlEncode("Hello World");



        var productToDetail = _contentService
            .Products
            .Where(q => q.Id == item)
            .Select(x => new CurrentProduct
            {
                TypeId = x.TypeId,
                Id = x.Id,
                FullName = x.FullName,
                Length = x.Length,
                Sku = x.Sku,
                Isbn = x.Isbn,
                Price = x.Price
            });



        var model = new DetailPageViewModel()
        {
            Verbiage = verbiage,
            CurrentProducts = productToDetail
        };

        return View("../Shared/DetailView", model);
    }