I'm tring to create a DbContext with my entites on entityframework5 codefirst way. I've brands, categories and products.
But when I try to get a Product
it's Brand
and Category
fields are null. Category
is optional but Brand
is not. So at least the Brand field has to be setted. I tried the code below. Is there any thing that I miss?
public DbSet<Brand> Brands { get; set; }
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Brand>()
.HasMany(b => b.Products)
.WithRequired(p => p.Brand)
.HasForeignKey(p => p.BrandId);
modelBuilder.Entity<Category>()
.HasMany(c => c.Products)
.WithOptional(p => p.Category)
.HasForeignKey(p => p.CategoryId);
}
And on MVC controller side:
using (var db = new InonovaContext())
{
var product = db.Products.Single(p => p.Id == id);
model.Description = product.Description;
model.ImageUrl = product.ImageUrl;
model.Name = product.Name;
model.BreadCrumb = product.Brand.Name + " / " + product.Category == null ? "" : (product.Category.Name + " / ") + product.Name; // Here Brand and Category are null
}
Product class is like below
public class Product
{
public int Id { get; set; }
public int BrandId { get; set; }
public virtual Brand Brand { get; set; }
public string Name { get; set; }
public int? CategoryId { get; set; }
public virtual Category Category { get; set; }
public string ImageUrl { get; set; }
public string Description { get; set; }
}
Brand class is like below:
public class Brand
{
public int Id { get; set; }
public string Name { get; set; }
public string ThumbLogoImageUrl { get; set; }
public string Description { get; set; }
public ICollection<Product> Products { get; set; }
}
Thanks.
A table can have many foreign keys. A foreign key is nullable if any part is nullable. A foreign key value is null if any part is null.
A foreign key is NULLABLE by DEFAULT in code first asp.net mvc - 5 entity framework. If we want to make it non nullable. we need to either use fluent api if not then decorate with "Required" attribute.
You can then configure foreign key properties by using the HasForeignKey method. This method takes a lambda expression that represents the property to be used as the foreign key.
If you haven't declared the Brand and Category as virtual, lazyloading of the Brand and Category properties will not work.
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public virtual Brand Brand { get; set; }
public int BrandId { get; set; }
public virtual Category Category { get; set; }
public int? CategoryId { get; set; }
}
See this for more information on lazy and eager loading.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With