C
C#3y ago
pyrodistic

Entity Framework One-To-One [Answered]

Code at: https://paste.mod.gg/rccwzntafwoj/0 When attempting to change the database I'm getting: The dependent side could not be determined for the one-to-one relationship between 'Room.Vet' and 'Vet.Room'. To identify the dependent side of the relationship, configure the foreign key property. If these navigations should not be part of the same relationship, configure them independently via separate method chains in 'OnModelCreating'. See http://go.microsoft.com/fwlink/?LinkId=724062 for more details. OR The property 'Room.Vet' is of type 'Vet' which is not supported by the current database provider. Either change the property CLR type, or ignore the property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'. I wanted to be able to create a Room that can have 0 or 1 Vets, and create a Vet that has 0 or 1 Rooms. What am I doing incorrectly? Thanks in advance.
BlazeBin - rccwzntafwoj
A tool for sharing your source code with the world!
Relationships - EF Core
How to configure relationships between entity types when using Entity Framework Core
12 Replies
Angius
Angius3y ago
You need to define the relationship explicitly
builder.Entity<One>()
.HasOne(o => o.Two)
.WithOne(t => t.One);
builder.Entity<One>()
.HasOne(o => o.Two)
.WithOne(t => t.One);
Might need .HasForeignKey() as well
pyrodistic
pyrodisticOP3y ago
I was currently doing:
modelBuilder.Entity<Vet>()
.HasOne(s => s.Room).WithOne(s => s.Vet)
.IsRequired(false);

modelBuilder.Entity<Room>()
.HasOne(s => s.Vet).WithOne(s => s.Room)
.IsRequired(false);
modelBuilder.Entity<Vet>()
.HasOne(s => s.Room).WithOne(s => s.Vet)
.IsRequired(false);

modelBuilder.Entity<Room>()
.HasOne(s => s.Vet).WithOne(s => s.Room)
.IsRequired(false);
Which prompts the second error when trying to submit changes.
Angius
Angius3y ago
Configure only one side of the relationship, it's enough
pyrodistic
pyrodisticOP3y ago
Thank you, understood, but it continues with the same error (the first one).
Angius
Angius3y ago
What's your config now?
pyrodistic
pyrodisticOP3y ago
Same that's on the link for code so:
public class DataContext : IdentityDbContext<User>
{
public DataContext(DbContextOptions<DataContext> options) : base(options)
{
}

public DbSet<Room> Rooms { get; set; }
public DbSet<Vet> Vets { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Vet>()
.HasOne(s => s.Room).WithOne(s => s.Vet)
.IsRequired(false);
}
}
public class DataContext : IdentityDbContext<User>
{
public DataContext(DbContextOptions<DataContext> options) : base(options)
{
}

public DbSet<Room> Rooms { get; set; }
public DbSet<Vet> Vets { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Vet>()
.HasOne(s => s.Room).WithOne(s => s.Vet)
.IsRequired(false);
}
}
Angius
Angius3y ago
Still no .HasForeignKey<T>() I see The docs you linked talk about it as well
Angius
Angius3y ago
pyrodistic
pyrodisticOP3y ago
I might be wrong, please tell me but I thing the .HasForeignKey() makes it so it cannot be nullable, or is that completely incorrect?
Angius
Angius3y ago
That's incorrect .IsRequired() is what sets it Also, make the key nullable just to make sure So not public int VetId { get; set; } but public int? VetId { get; set; } for example
pyrodistic
pyrodisticOP3y ago
Shouldn't have assumed that .HasForeignKey() determined requirement. Thank you so much!
Accord
Accord3y ago
✅ This post has been marked as answered!
Want results from more Discord servers?
Add your server