Основано на отношениях - EF Core | Документы Microsoft вы можете использовать аннотации данных
аннотации данных
Существуют две аннотации данных, которые можно использовать для настройки отношений, [ForeignKey] и [InverseProperty]. [1112 ]
[ForeignKey]
Аннотации данных можно использовать, чтобы указать, какое свойство следует использовать в качестве свойства внешнего ключа для данного отношения. Обычно это делается, когда свойство внешнего ключа не обнаружено соглашением.
[InverseProperty]
Вы можете использовать аннотации данных, чтобы настроить, как соединяются свойства навигации на зависимых и главных объектах. Обычно это делается, когда между двумя типами сущностей существует более одной пары свойств навигации.
blockquote>public class Team { public int Id { get; set; } public string Name { get; set; } [InverseProperty("HomeTeam")] public ICollection
HomeGames { get; set; } [InverseProperty("AwayTeam")] public ICollection AwayGames { get; set; } } public class Game { public int Id { get; set; } public DateTime Date { get; set; } public int HomeTeamId { get; set; } [ForeignKey("HomeTeamId")] public Team HomeTeam { get; set; } public int AwayTeamId{ get; set; } [ForeignKey("AwayTeamId")] public virtual Team AwayTeam { get; set; } } если вы используете db.Database.Migrate (), вы получите сообщение об ошибке
System.Data.SqlClient.SqlException: 'введение ограничения FOREIGN KEY' FK_Games_Teams_HomeTeamId 'на Таблица «Игры» может вызывать циклы или множественные каскадные дорожки. Укажите ON DELETE NO ACTION или ON UPDATE NO ACTION, либо измените другие ограничения FOREIGN KEY. Не удалось создать ограничение или индекс. Посмотрите предыдущие ошибки
blockquote>, вы можете сделать HomeTeamId AwayTeamId int? обнуляемым
public class Team { public int Id { get; set; } public string Name { get; set; } [InverseProperty("HomeTeam")] public ICollection
HomeGames { get; set; } [InverseProperty("AwayTeam")] public ICollection AwayGames { get; set; } } public class Game { public int Id { get; set; } public DateTime Date { get; set; } public int? HomeTeamId { get; set; } [ForeignKey("HomeTeamId")] public Team HomeTeam { get; set; } public int? AwayTeamId{ get; set; } [ForeignKey("AwayTeamId")] public virtual Team AwayTeam { get; set; } } или см. Каскадное удаление - EF Core | Документы Microsoft
здесь полный код, который я тестировал и работал ( дБ сначала не код первым )
для кода сначала используйте int?
для Program.cs
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; namespace stackoverflow54196199 { public class Team { public int Id { get; set; } public string Name { get; set; } [InverseProperty("HomeTeam")] public ICollection
HomeGames { get; set; } [InverseProperty("AwayTeam")] public ICollection AwayGames { get; set; } } public class Game { public int Id { get; set; } public DateTime Date { get; set; } public int HomeTeamId { get; set; } [ForeignKey("HomeTeamId")] public Team HomeTeam { get; set; } public int AwayTeamId { get; set; } [ForeignKey("AwayTeamId")] public Team AwayTeam { get; set; } } public class MyContext : DbContext { public DbSet Games { get; set; } public DbSet Teams { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("Server=.;Integrated Security=true;Initial Catalog=stackoverflow54196199;Persist Security Info=False;"); } } class Program { static void Main(string[] args) { var db = new MyContext(); foreach (var game in db.Games.Include(i => i.AwayTeam).Include(i => i.HomeTeam)) { Console.WriteLine(game.HomeTeam.Name); Console.WriteLine(game.AwayTeam.Name); } Console.ReadLine(); } } } для stackoverflow54196199.csproj
Exe netcoreapp2.1
Html Agility Pack скоро будет поддерживать его.
http://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=204342