Skip to content

OneToOne

Marcin Sulecki edited this page Apr 4, 2017 · 8 revisions

Relacja Jeden-do-jeden

Podstawowy model

  public class Employee
    {
        public int EmployeeId { get; set; }
        public string Name { get; set; }

        public EmployeePhoto Photo { get; set; }
    }

 public class EmployeePhoto
    {
        public int EmployeeId { get; set; }

        public byte[] Photo { get; set; }

        public string Caption { get; set; }

        public Employee PhotoOf { get; set; }

    }

Domyślna konwencja

Trudno jest określić, która encja jest zależna od której więc nie jest możliwe utworzenie domyślnej konwencji. Trzeba użyć konfiguracji.

Fluent API

Konfiguracja

 modelBuilder.Entity<EmployeePhoto>()
                .HasKey(p=>p.EmployeeId)
                .HasRequired(p => p.PhotoOf)
                .WithOptional(p => p.Photo);

Struktura bazy danych

Pracownik nie może zostać usunięty jeśli istnieje zdjęcie.

Dodanie zdjęcia do bazy danych

var filename = @"marcin.jpg";

            var photo = File.ReadAllBytes(filename);

           
            var employee = new Employee
            {
                Name = "Marcin",
                Photo = new EmployeePhoto
               {
                   Caption = "Zdjęcie",
                   Photo = photo,
               },

           };

            using (var context = new MyContext())
            {
                context.Employees.Add(employee);

                context.SaveChanges();
            }

Usuwanie powiązanej encji

Jeśli chcemy usunąć wraz pracownikiem powiązane zdjęcie to możemy ustawić kaskadowe usuwanie za pomocą WillCascadeOnDelete

 modelBuilder.Entity<EmployeePhoto>()
                .HasKey(p=>p.EmployeeId)
                .HasRequired(p => p.PhotoOf)
                .WithOptional(p => p.Photo)
                .WillCascadeOnDelete(true);

Ustawienie głównej encji

Przykład ustawienia zdjęcia jako encji nadrzędnej

 modelBuilder.Entity<EmployeePhoto>()
                .HasKey(p=>p.EmployeeId)
                .HasRequired(p => p.PhotoOf)
                .WithRequiredPrincipal(p => p.Photo)
                .WillCascadeOnDelete(true);
Clone this wiki locally