/ / Foriegn Ключ от множество таблици на една колона EF код Първо - структура на обекти, дизайн на база данни, ef-code-first

Foriegn Ключ от множество таблици в една колона EF код Първо - рамка на обекта, дизайн на база данни, ef-code-first

Използвам EF версия 6.1 и имам проблем с картографирането:

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
}

клас на присъствие

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

Трябва да отбележа присъствието както на Студентски, така и на СтудентскиПотребител в същата таблица. UserType ще определи дали Id е на студент или Потребител, а първичният ключ ще бъде комбинация от UserType и Id.

Как мога да постигна това, използвайки първия подход на EF код.

Отговори:

-1 за отговор № 1

За съжаление не можете да използвате няколко типа над единиченИмот. Вие разбирате, защото EF се справя с метаданни. Които използват EF познават метаданни от моделен клас. Това е проблем. Таблица за присъствие на foregin ключ е множествена таблица referance и Attendance модел съдържа и двата модела. Трябва да създадете логически слой за проверка на UserType и да получите достъп до правилния модел. Например

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;}
}

сега слой клас

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

как да използвам

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

ако не можете да използвате типа резултат на обекта, запишете интерфейса и двата класа и задайте типа връщане на този интерфейс.