1

У меня есть две сущности:Как иметь два различных навигационных свойств одного и того же другого типа объекта с использованием атрибутов

//The master table/entity 
[TABLE("POSITIONS")] 
public class Position{ 
    [Key,Column("POSITIONID")] 
    public int PositionId{get;set;} 
    [Column("POSITIONNAME")] 
    public string PositionName{get;set;} 
} 

//The detail table/entity 
[TABLE("SLAVE_POSITIONS")] 
public class SlavePosition{ 
    [Key,Column("MASTERPOSID",Order=0)] 
    public int MasterPosId{get;set;} 
    [KEY,Column("SLAVEPOSID",Order=1)] 
    public string SlavePosId{get;set;} 

    [ForeignKey("MasterPosId")] 
    public virtual Position MasterPosition {get;set;} 
    [ForeignKey("SlavePosId")] 
    public virtual Position SlavePosition {get;set;} 
} 

В SlavePosition, как вы можете видеть, есть две колонки, по которой этот объект находится в FK отношениях с позицией. Этот макет отлично работает. Теперь мне также нужно добавить это свойство коллекции для установки объекта:

public virtual ICollection<SlavePosition> SlavePositions{get;set;} 

Но, видимо, EF запутается, и я получаю {"ORA-00904: \"Extent1\".\"Position_PositionId\": invalid identifier"} ошибку. Если я объявляю это так:

[ForeignKey("SlavePositionId")] 
public virtual ICollection<SlavePosition> SlavePositions { get; set; } 

, а затем принести позиции с PositionId = 1, как это:

Position pos= dbContext.Positions.SingleOrDefault(x=>x.PositionId==1); 

я не получаю ошибку, но я получаю подсчитывать 0 SlavePOsitions, когда оно должно быть 5, потому что в базе данных у меня есть 5 строк в таблице подробностей. Я могу подтвердить это, выполнив приведенный ниже код:

IEnumerable<SlavePositions> slavePositions= dbcontext.SlavePositions.Where(x=>x.MasterPositionId==1); 

Я получаю пять SlavePosition.

Что должно быть правильным атрибутом для этого свойства коллекции?

ответ

2

Я, наконец, понял это. Моя ошибка была в названии зависимого свойства ссылки. Вместо SlavePositionId я должен положить MasterPositionId.

Это имеет смысл, поскольку объект Position действует как мастер-таблица, а в реальном мире отношение внешнего ключа настраивается на подробных таблицах, а не на основных. Поскольку в зависимой сущности нет объекта с тем же именем, что и PK в основной сущности, и существует более одного свойства, которое имеет значение «Foreignkey» для одного и того же главного объекта, EF нуждается в дополнительной информации. Указывая ForeignKey("MasterPositionId") на свойство навигации ICollection , Я инструктирую EF, что свойство конечной точки Dependent следует считать MasterPositionId. Так что я изменил эту

[ForeignKey("SlavePositionId")] 
public virtual ICollection<SlavePosition> SlavePositions { get; set; } 

к этому

[ForeignKey("MasterPositionId")] 
public virtual ICollection<SlavePosition> SlavePositions { get; set; } 

На самом деле бывший один сам по себе не является неправильным либо, он просто не подходит в данной ситуации. Но если бы я хотел иметь коллекцию для MasterPositions, это было бы прекрасно.

 Смежные вопросы

  • Нет связанных вопросов^_^