/ / Foriegn Kľúč z viacerých tabuliek v jednom stĺpci Kód EF Prvý - entity-framework, design databázy, ef-code-first

Foriegn Kľúč z viacerých tabuliek v jednom stĺpci Kód EF Prvý - entity-framework, design databázy, ef-code-first

Používam EF verziu 6.1 a mám problém s mapovaním:

class BasePoco
{
public Guid Id{get;set;}
}
class Student : BasePoco
{
public string Name;
}
public class UserBase : BasePoco
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Gender { get; set; }
public string Photo { get; set; }
}
public class UserDetail : UserBase
{
public string MobileNumber { get; set; }
public string EmailID { get; set; }
}
public Enum UserType
{
Student = 1,
User=2
}

triedu dochádzky

public class Attendance
{
public class UserId {get;set;}   // Can be either student or user
public UserType UserType {get;set;}
}

Musím označiť účasť pre študentov, rovnako akoPoužívateľ v rovnakej tabuľke. UserType by určil, či Id je študent alebo používateľ a primárny kľúč by bol kombináciou UserType a Id.

Ako to môžem dosiahnuť pomocou prvého prístupu k kódu EF?

odpovede:

-1 pre odpoveď č. 1

Ospravedlňujeme sa, že nemôžete používať viacnásobný typ v jednomvlastnosť. Chápete, pretože EF používa metadáta. Ktoré EF používajú metadáta z triedy modelov. Toto je problém. Kľúčový vstupný klávesový stôl je viacnásobná tabuľka a model dochádzky obsahuje aj model. Mali by ste vytvoriť logickú vrstvu pre kontrolu UserType a prístup k správnemu modelu. Napríklad

public class Attendance
{
public UserType userType {get;set;}

public Guid? UserId {get;set;}
public virtual User user {get;set;}

public Guid? StudentId {get;set;}
public virtual Student student {get;set;}
}

teraz vrstvová trieda

public class AttendanceUserLayer
{
public static object GetUser(Attendance attendance) {
if (attendance.userType == UserType.User) {
return attendance.User;
} else {
return attendance.Student;
}
}

ako použiť

Attendance attendance = context.Attendance.FirstOrDefault();
var userOrStudent = AttendanceUserLayer.GetUser(attendance);

ak nemôžete použiť typ výsledku objektu, napíšte rozhranie ako triedu, tak nastavte návratový typ tohto rozhrania.