Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to map a Value Type which has a reference to an entity?

I'm having a problem with a mapping in Entity Framework.

I have the following classes (simplified):

public class Building
{

    public int ID { get; set; }     
    // *.. snip..* other properties
    public Location Location { get; private set; }
}

public class Location
{
    public string Street {get; set;}
    public Country country {get; set}
}
public class Country
{
    public int ID { get; set; } 
    public string Name { get; set; } 
}

Building and Country are entities, they are saved in the database. Location is a value type and should map to the same table as Building.

However, when I map it this way, entity framework wants to map Location to a table as well and is complaining it has no Key. I don't want to give it a key since it belongs to the Building and should not be an entity at all.

I have seen workarounds which say you need to put Country on the Building-class, but that just doesn't feel good (and is semantically just plain wrong).

I'm using Entity Framework 5

like image 572
Kenneth Avatar asked Jun 24 '13 12:06

Kenneth


People also ask

What is mapping in Entity Framework?

It is a tool to access the database. More accurately, it's classified as an Object/Relational Mapper (ORM) which means it maps data in a relational database into objects of our applications. Entity Framework. It is a tool to access the database.

What is navigation property in Entity Framework?

A navigation property is an optional property on an entity type that allows for navigation from one end of an association to the other end. Unlike other properties, navigation properties do not carry data. A navigation property definition includes the following: A name. (Required)


1 Answers

Since the release of Entity Framework Core 2, it is now possible to achieve this using owned entities.

Your configuration would look like:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // ...
    modelBuilder.Entity<Building>().OwnsOne(x => x.Location);
    modelBuilder.Entity<Location>().HasOne(x => x.Country);
    // ...
}

This way, properties from Location class will be a part of the table Building class is mapped to. This means you will only have tables for Building and Country classes and the Building table will have a foreign key to the Country table.

I know it's been a long since you posted the question, but I thought this answer might be helpful to someone who comes across this question.

like image 104
Marko Papic Avatar answered Oct 07 '22 17:10

Marko Papic