2015-03-03 3 views
0

Я хотел бы, чтобы все мои объекты, которые наследуют BaseEntity иметь коллекцию одной сущности, это мой образецEF Code First Многие ко многим BaseEntity Наследование

public abstract class BaseEntity : IEntity 
{ 
    [Key] 
    public Guid Id { get; set; } 

    public virtual ICollection<Note> Notes { get; set; } 

    protected BaseEntity() 
    { 
     Id = Guid.NewGuid(); 
     Notes = new List<Note>(); 
    } 
} 

public class Note 
{ 
    [Key] 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public string Value { get; set; } 

    public Note() 
    { 
     Id = Guid.NewGuid(); 
    } 
} 

public class Student : BaseEntity 
{ 
    public string Name { get; set; } 
    public School School { get; set; } 
    public string SomeInfo { get; set; } 
} 

public class School : BaseEntity 
{ 
    public string Name { get; set; } 
    public int Rating { get; set; } 
    public int Size { get; set; } 
} 

Я хотел бы, чтобы отобразить это что-то вроде этого, потому что по Notes таблицы по умолчанию имеет все идентификаторы всех таблиц (student_id, School_Id и т.д.)

ManyToMany

Любые идеи, как это сделать, или что искать?

+0

Вы имеете в виду, что вы не хотите иметь таблицу/отношение 'ManyToManyNotes'? – Stefan

+0

Мне нравится иметь много-много таблиц, но я не знаю, как их сопоставить, поэтому все таблицы будут использовать его. –

ответ

2

Вы можете добавить ObjectId в таблицу заметок, чтобы указать на связанный объект (ученик, школа и т. Д.). И украсьте свой базовый класс атрибутом [ForeignKey («ObjectId»)].

public abstract class BaseEntity : IEntity 
{ 
    [Key] 
    public Guid Id { get; set; } 

    [ForeignKey("ObjectId")] 
    public virtual ICollection<Note> Notes { get; set; } 

    protected BaseEntity() 
    { 
     Id = Guid.NewGuid(); 
     Notes = new List<Note>(); 
    } 
} 

public class Note 
{ 
    [Key] 
    public Guid Id { get; set; } 
    public Guid ObjectId { get; set; } //student, school, etc 
    public string Name { get; set; } 
    public string Value { get; set; } 

    public Note() 
    { 
     Id = Guid.NewGuid(); 
    } 
} 

Это один-ко-многим, и не требует таблицы отображения, как вы используете Guids в качестве первичных ключей, вам не нужно беспокоиться о объектных идентификаторов повторяющимися в разных таблицах.

+0

nope does not work Consent_Notes_Source_Consent_Notes_Target:: Число свойств в зависимых и основных ролях в ограничении отношений должно быть идентичны. –

+0

Он должен работать, проверьте свой код. В этом случае ваша таблица имеет только одно поле идентификатора? – hazimdikenli

+0

Это работает, но вы знаете, как сделать такую ​​таблицу без внешнего ключа, но с навигационным свойством, потому что производительность будет очень медленной. –