Я работаю над веб-сайтом ASP .Net CORE MVC с Entity Framework, и у меня двойная связь между двумя таблицами:
DocType
# DocTypeName
#DocTypeValidationText
Интерфейс
+ id
DocTypeName и DocTypeValidationText являются ForeignKey для таблицы Интерфейс: один DocType имеет 2 Интерфейс
вот мой класс:
DocType.cs
public class DocType
{
[Key]
public int DocTypeID { get; set; }
[Required]
public int DocTypeName { get; set; }
[ForeignKey("DocTypeName")]
public virtual TraductionInterface TraductionInterfaceName { get; set; }
[Required]
public int DocTypeValidationText { get; set; }
[ForeignKey("DocTypeValidationText")]
public virtual TraductionInterface TraductionInterfacevalidationText { get; set; }
}
TraductionInterface.cs
public class TraductionInterface
{
[Key]
public int TraductionInterfaceID;
[ForeignKey("DocTypeName")]
public virtual DocType DocTypeName { get; set; }
[ForeignKey("DocTypeValidationText")]
public virtual DocType DocTypeValidationText { get; set; }
}
ApplicationDbContext.cs
builder.Entity<DocType>().ToTable("DocType").HasOne(d => d.TraductionInterfaceName).WithOne(t => t.DocTypeName);
builder.Entity<DocType>().HasOne(d => d.TraductionInterfacevalidationText).WithOne(t => t.DocTypeValidationText);
но я получаю эту ошибку, когда пытаюсь обновить
Cannot call Property for the property 'DocTypeValidationText' on entity type 'TraductionInterface' because it is configured as a navigation property. Property can only be used to configure scalar properties.
РЕДАКТИРОВАТЬ
Решение @ user1672994, похоже, решило проблему, но применимо только первое отношение:
ifbuilder.Entity<DocType>().ToTable("DocType").HasOne(d => d.TraductionInterfaceName).WithOne(t => t.DocTypeName);
до builder.Entity<DocType>().HasOne(d => d.TraductionInterfacevalidationText).WithOne(t => t.DocTypeValidationText);
отношение TraductionInterfaceName применяется, иначе это отношение TraductionInterfacevalidationText. Как я могу заставить эти 2 отношения работать вместе?





В самой ошибке указано, что вы должны определить скалярное свойство и при определении отношения ForeignKey. Приведенный ниже код определяет свойства отношения и использует его при присоединении отношения ForeignKey.
public class TraductionInterface
{
[Key]
public int TraductionInterfaceID {get; set; }
public int DocTypeNameId {get; set; }
[ForeignKey("DocTypeNameId")]
public virtual DocType DocTypeName { get; set; }
public int DocTypeValidationTextId {get; set; }
[ForeignKey("DocTypeValidationTextId")]
public virtual DocType DocTypeValidationText { get; set; }
}
Ваше решение, похоже, исправляет ошибку, но теперь у меня другая ошибка: тип объекта TraductionInterface требует определения первичного ключа. но TraductionInterfaceID в качестве аннотаций [Key, DatabaseGenerated (DatabaseGeneratedOption.Identity)]
Установите ключ как builder.Entity<TraductionInterface>().ToTable("DocType").HasKey(t => t.TraductionInterfaceID)
Я пробовал, но получил ошибку: The properties expression 't => Convert(t.TraductionInterfaceID, Object)' is not valid. The expression should represent a property access: 't => t.MyProperty'. When specifying multiple properties use an anonymous type: 't => new { t.MyProperty1, t.MyProperty2 }'. ps: это таблица ("TraductionInterface") вместо ToTable ("DocType") или я ошибаюсь?
Вы правы, это должен быть table("TraductionInterface")
Проверьте, нужно ли вам определять HasForeignKey при определении сущностей.
Отношения один к одному или нулю, похоже, не работают в текучем API: EntityTypeBuilder<DocType> doesn't contain definition for HasRequired и HasForeignKey не работают с отношением один к одному, у меня есть следующие варианты использования: using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;, если это поможет
Что касается ошибки ключа, это был просто {get; set;}, который отсутствовал в ключе.
Хорошо! Итак, ваша проблема исправлена?
Нет, см. Правку выше, у меня не может быть двух отношений, используется только первое, я заставил его работать, вручную отредактировав файл миграции, но это не лучшее решение
Думаю, вы ищете обратное свойство: entityframeworktutorial.net/code-first/…
Если вам не нужны открытые идентификаторы внешнего ключа, просто удалите атрибуты
[ForeignKey], и EF создаст их незаметно. Лично я предпочитаю их разоблачать.