我正在使用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今天让我失望了。我做错了什么?
答案 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);
}