wenn32
wenn32

Reputation: 1382

EF foreign key reference using Id vs object

What is the difference between foreign key reference using Id vs object.

For example: FK relation using Id

class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }

    public int CategoryId { get; set; }
}

vs FK relation using object

class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }

    public Category Category { get; set; }
}

I have noticed from database that by using Id property the column essentially becomes non-null field.

Is that the only difference? I think we can't query multiple tables at once i.e.querying related data?

When should I choose to use either options?

Upvotes: 7

Views: 6506

Answers (2)

The One
The One

Reputation: 4784

In your first example you're not adding a relationship, just an integer property named CategoryId. In your second example, Entity Framework will create an integer column named "Category_ID", but you will be not be able to see this property in your model, so I like to explicitly add it my self and be able to use it along with the navigation property.

class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }


    [ForeignKey("Category")]
    public int CategoryId { get; set; }
    public Category Category{get;set;}
}

This way you can also control the data type of CategoryId, so you could make it optional (nullable)

public int? CategoryId { get; set; }

*The foreign key data annotation is not needed, unless you have property or navigation property names that do not follow the naming convention for foreign key property names" (Bardr), it doesn't harm to explicitly declare it either for clarity purposes

This implies that you're creating a 1 to many relationship (1-*) with products and categories, so in your Category class you would be adding a collection navigation property for products

class Category
{
  public int Id{ get; set;}
  public string Name{ get; set; }
  ...
  public ICollection<Product> Products{get; set;}
}

Upvotes: 7

Bardr
Bardr

Reputation: 2559

Basically it depends on your use case and what type of loading related data you choose. Whether you use Id or object reference or full relationship on both sides (Id and object) it depends on your overall application architecture. If you wil go and use full or object reference everywhere, you will (probably) end up with a mess, and you won't know whether you should query for some entities using their repository or if it'll be okay to include them to some other query. I highly recommend you to take a look at this book, especially chapter 19 (Aggregates) and 21 (Repositories). There you have an in-depth explanation of what I meant and much more. (This does not only apply to applications built in DDD way)

Upvotes: 4

Related Questions