Связь один к одному

172
28 октября 2018, 17:50

Model. В таблицах указал

CONSTRAINT [FK_Profiles_Infos] FOREIGN KEY ([InfoId])
    REFERENCES [dbo].[Infos] ([Id]) ON DELETE SET NULL
CONSTRAINT [FK_Сars_Infos] FOREIGN KEY ([InfoId])
    REFERENCES [dbo].[Infos] ([Id]) ON DELETE SET NULL

namespace Meditid.Models
{
    public class Info
    {
        [Key]
        public int Id { get; set; }
        public virtual Profile Profile { get; set; }
        public virtual Collection<Car> Car { get; set; }
    }
    public class Profile
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public DateTime BirthDate { get; set; }
        public string LastName { get; set; }
        public string MiddleName { get; set; }
        public int InfoId { get; set; }
        public virtual Info info { get; set; }
    }
    public class Car
    {
        public int Id { get; set; }
        public string CarName { get; set; }
        public string CarNumber { get; set; }
        public int InfoId { get; set; }
        public virtual Info info { get; set; }
    }
    public class SContext : DbContext
    {
        public DbSet<Profile> Profiles { get; set; }
        public DbSet<Car> Cars { get; set; }
        public DbSet<Info> Infos { get; set; }
    }
}

Функция формирования json'a из 3 таблиц

public string Lowx()
{
    var query = db.Infos
        .Include(x => x.Profile)
        .Include(x => x.Car)
        .ToList();
    return JsonConvert.SerializeObject(query.ToList());
}

Выдает исключение:

System.InvalidOperationException: "Unable to determine the principal end of an association between the types 'Meditid.Models.Profile' and 'Meditid.Models.Info'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations."

Answer 1

Используйте DataAnnotation (Подробнее):

namespace Meditid.Models
{
    public class Info
    {
        [Key]
        public int Id { get; set; }
        public virtual Profile Profile { get; set; }
        public virtual ICollection<Car> Car { get; set; }
    }
    public class Profile
    {
        [Key]
        public int Id { get; set; }
        public string FirstName { get; set; }
        public DateTime BirthDate { get; set; }
        public string LastName { get; set; }
        public string MiddleName { get; set; }
        public int InfoId { get; set; }
        [ForeignKey("InfoId")]
        public virtual Info Info { get; set; }
    }
    public class Car
    {
        public int Id { get; set; }
        public string CarName { get; set; }
        public string CarNumber { get; set; }
        public int InfoId { get; set; }
        [ForeignKey("Info")]
        public virtual Info info { get; set; }
    }
}

или же можно использовать FluentAPI (Подробнее):

public class SContext : DbContext
{
    public DbSet<Info> Infos { get; set; }
    public DbSet<Profile> Profiles { get; set; }
    public DbSet<Car> Cars { get; set; }
    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);
        builder.Entity<Info>()
            .HasOne(i => i.Profile)
            .WithOne(p => p.Info)
            .HasForeignKey<Profile>(p => p.InfoId);
        builder.Entity<Info>()
            .HasMany(i => i.Cars)
            .WithOne(c => c.Info)
            .HasForeignKey<Car>(c => c.InfoId);
    }
}
READ ALSO
Как объединить две ObservableCollection (WPF)

Как объединить две ObservableCollection (WPF)

Подскажите, пожалуйста, как можно объединить две коллекции в одну, чтобы получилась не сплошная строка например:

284
Не могу обратится к ListBox С# MVVM WPF

Не могу обратится к ListBox С# MVVM WPF

Цель - сделать отчет в CSV файл

171
Исключение типа StackOverflow C#

Исключение типа StackOverflow C#

В строке определения переменной text возникает ошибка StackOverflow и не знаю как можно избавиться от его потому что условие обязательное

166
Странное поведение if-else

Странное поведение if-else

Метод обрабатывает нажатие клавишы на клавиатуре (глобальный хук) и скрывает элементы на экранеОднако почему-то после активации if(!SomeOpened)...

196