Entity Framework отношения один-ко-многим и многие-ко-многим

c# entity-framework

133 просмотра

1 ответ

В настоящее время я изучаю структуру сущностей и несколько дней терпел неудачу с этой задачей ... Я хотел бы получить следующую схему базы данных:

TableA:
ClassA_ID
ClassB_ID(foreign key - one to one)

TableATableB:(one-to-many relationship)
ClassA_ID
ClassB_ID

TableB:
ClassA_ID(foreign key - one to one)
ClassB_ID

Поэтому я на самом деле хочу конкретное отношение один-к-одному из класса А в класс В и отношение один ко многим из класса А в класс Б.

Мой код C # выглядит следующим образом:

Класс А:

public static int idcounter;
[Key]
public int id { get; set; }
public virtual List<ClassB> allClassB { get; set; }
public virtual ClassB currentClassB { get; set; }
public int? currentClassBID { get; set; }

public ClassA(){
    idcounter++;
    id = idcounter;
    allClassB = new List<ClassB>();
    currentClassB = new ClassB();
    currentClassBID = currentClassB.id;
    MyContext.add(this);
}

Класс Б:

public static int idcounter;
[Key]
public int id { get; set; }
public virtual ClassA owner { get; set; }
public int? ownerID { get; set; }

public ClassB(ClassA a){
    idcounter++;
    id = idcounter;
    owner = a;
    ownerID =  a.id;
}

MyContext:

public static void add(ClassA a)
    {
        using (MyContext context = new MyContext ())
        {
            context.setB.Add(a.currentClassB);
            context.setA.Add(a);
            context.SaveChanges();           
        }
    }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ClassA>().HasOptional(x => x.currentClassB ).WithMany().HasForeignKey(x => x.currentClassBID ).WillCascadeOnDelete(false);
        modelBuilder.Entity<ClassB>().HasOptional(x => x.ClassA).WithMany(x => x.allClassB).HasForeignKey(x => x.ownerID).WillCascadeOnDelete(false) ;
    }

Это очень похоже на этот вопрос Entity Framework Code First: как я могу создать отношения «один ко многим» и «один к одному» между двумя таблицами? но я просто получаю Круглое Исключение при сохранении.

Unable to determine a valid ordering for dependent operations. Dependencies may 
exist due to foreign key constraints, model requirements, or store-generated 
values.

Это довольно странно, что после

context.setA.Add(a);

он добавляет currentClassB в allClassB без моего упоминания о том, что ... это даже неожиданно происходит, когда я не

allClassB = new List<ClassB>();

Что я делаю неправильно?

Автор: Milleu Источник Размещён: 08.11.2019 11:27

Ответы (1)


0 плюса

Решение

Вы должны использовать, InversePropertyкак показано ниже.

[InverseProperty("allClassB")]
public virtual ClassB currentClassB { get; set; }
public int? currentClassBID { get; set; }

DataAnnotations - Атрибут InverseProperty:

Автор: Sampath Размещён: 20.08.2016 04:17
Вопросы из категории :
32x32