У меня есть иерархическая связь, определенная для одной из моих таблиц, где эта связь хранится в отдельной таблице соединений.Таблица соединений также содержит информацию о типе отношений.(Упрощенная) схема выглядит следующим образом:
Bills
ID int IDENTITY(1,1) NOT NULL (PK)
Code varchar(5) NOT NULL
Number varchar(5) NOT NULL
...
BillRelations
ID int IDENTITY(1,1) NOT NULL (PK)
BillID int NOT NULL
RelatedBillID int NOT NULL
Relationship int NOT NULL
...
У меня есть отношения FK, определенные в BillID и RelatedBillID к идентификатору в таблице Bills.
Я пытаюсь отобразить это в Entity Framework CodeСначала с небольшим успехом.Мои занятия выглядят следующим образом.Не обращайте внимания на RelationshipWrapper
, это класс-оболочка для enum
с именем Relationship
, который соответствует значению в столбце Отношения.
public class Bill
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[Required]
[StringLength(5)]
public string Code { get; set; }
[Required]
[StringLength(5)]
public string Number { get; set; }
public virtual ICollection<BillRelation> RelatedBills { get; set; }
...
}
public class BillRelation
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public long BillID { get; set; }
[ForeignKey("BillID")]
public virtual Bill Bill { get; set; }
public long RelatedBillID { get; set; }
[ForeignKey("RelatedBillID")]
public virtual Bill RelatedBill { get; set; }
public RelationshipWrapper Relationship { get; set; }
...
}
Я пробовал это в разных воплощениях, используя обаявно определенные отношения через ModelBuilder только для DbContext и аннотаций данных, но вышеизложенное определяет то, что я ищу.Я использую коллекции, потому что свойства внешнего ключа не являются первичными ключами.
Используя эту настройку, я получаю ошибку: Bill_ID column is not defined
(или что-то подобное).
Если я получилМаршрут ModelBuilder с использованием следующего, я получаю сообщение об ошибке «Таблица BillRelations не существует в базе данных».
modelBuilder.Entity<Bill>().HasMany( b => b.RelatedBills )
.WithRequired( r => r.Bill )
.Map( m => m.MapKey( "BillID" ).ToTable( "BillRelations" ) );
modelBuilder.Entity<BillRelation>().HasRequired( r => r.RelatedBill )
.WithRequiredDependent()
.Map( m => m.MapKey( "RemoteBillID" ).ToTable( "BillRelations" ) );
Мне удалось заставить его работать, определив только одну половину отношения,Счета -> BillRelations, затем с помощью Join в моем репозитории заполнить свойство [NotMapped]
RelatedBill класса BillRelations для каждого из связанных счетов в коллекции RelatedBills счета.Я бы предпочел не делать этого, если смогу помочь.
Единственное другое решение, о котором я подумал, - это смоделировать каждое отношение в отдельной таблице (существует 4 типа) и использовать стандартный Билл <-> Билл отображает таблицу соединений для каждого из 4 типов отношений - опять же, я бы предпочел не делать этого, если смогу избежать этого.
Может кто-нибудь увидеть, что я делаю неправильно, или сказать мне, если чтоЯ хочу сделать это даже возможно в EF Code First 4.1?