2014-09-17 4 views
0

Может ли кто-нибудь помочь мне использовать модельный конструктор в этом сценарии. Я пробовал что-то вроде этого:необязательный для необязательного отношения в структуре сущности

modelBuilder.Entity<User>() 
     .HasOptional(f => f.Employee) 
     .WithOptionalPrincipal(e => e.User); 

public class User 
{ 
     public int UserID {get; set;} 
     public virtual Employee employee{get; set;} 
} 
public class Employee 
{ 
     public int EmployeeID {get; set;} 
     public int UserID {get; set;} 
     public virtual User user {get; set;} 
} 

Он не получает данные о сотрудниках.

+0

Я думаю, что нет факультативного отношения к факультативным отношениям, у Принципала может быть опция Dependent, но Dependent требует наличия существующего Принципала для ссылки. Если это не отношение к многим, где зависимый может иметь факультативный Принципал. Но в отношениях один к одному или нолю, я боюсь, что таких отношений (opt to opt) не существует. –

+0

любой другой способ обойти его? –

ответ

0

Работа по вашему требованию будет создавать отношения «один-два» с независимой ассоциацией.

public class User // Principal 
{ 
    public int UserID { get; set; } // PK 
    public virtual Employee Employee { get; set; } 
} 
public class Employee // Dependent 
{ 
    public int EmployeeID { get; set; } // PK 
    // public int UserID {get; set; } // remove to create independent association 
    public virtual User User { get; set; } 
} 

Config

modelBuilder.Entity<User>() 
    .HasOptional(u => u.Employee) 
    .WithOptionalPrincipal(e => e.User); 

Сформированная база данных будет создавать один ко многим отношений. Пользователь становится Принципалом, а Сотрудник становится зависимым, но у Работника может быть факультативный Принципал.

using (var db = new AppContext()) 
{ 
    // User can have optional Employee. 
    db.Users.Add(new User { UserID = 1, Employee = null }); 
    db.SaveChanges(); 
} 
using (var db = new AppContext()) 
{ 
    // Employee can have optional User. 
    db.Employees.Add(new Employee { EmployeeID = 1, User = null }); 
    db.Employees.Add(new Employee { EmployeeID = 2, User = null }); 
    db.SaveChanges(); 
} 

User   Employee 
------  ---------------------- 
UserID  EmployeeID User_UserID 
    1   1   null 
       2   null 

Связанный сотрудник (1) с пользователем (1).

using (var db = new AppContext()) 
{ 
    var employee = db.Employees.Find(1); 
    employee.User = db.Users.Find(1); 
    db.SaveChanges(); 
} 

User   Employee 
------  ---------------------- 
UserID  EmployeeID User_UserID 
    1   1   1 
       2   null 

Связанный сотрудник (2) с пользователем (1).

using (var db = new AppContext()) 
{ 
    var employee = db.Employees.Find(2); 
    employee.User = db.Users.Find(1); 
    db.SaveChanges(); 
} 

User   Employee 
------  ---------------------- 
UserID  EmployeeID User_UserID 
    1   1   null 
       2   1 

Конечно, если мы вручную изменим его из базы данных, он будет работать, но при его исполнении может возникнуть непредвиденное поведение.

update Employees set User_UserId = 1