Entity Framework Core - множественные отношения один-ко-многим между двумя объектами

Вам нужно заменить его как WHERE clockDate = { fn CURRENT_DATE() } AND userName = 'test'. Удалите лишний ")" из { fn CURRENT_DATE() })

3
задан Mr. Nicky 15 January 2019 в 10:01
поделиться

2 ответа

Вы должны сообщить Entity Framework, какие свойства в обоих объектах участвуют в одной ассоциации. В API Fluent Mapping это выглядит следующим образом:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Team>().HasMany(t => t.HomeGames)
        .WithOne(g => g.HomeTeam)
        .HasForeignKey(g => g.HomeTeamId);
    modelBuilder.Entity<Team>().HasMany(t => t.AwayGames)
        .WithOne(g => g.AwayTeam)
        .HasForeignKey(g => g.AwayTeamId).OnDelete(DeleteBehavior.Restrict);
}

Вы должны использовать свободный API, потому что по умолчанию EF пытается создать два внешних ключа с каскадным удалением. SQL Server не допустит этого из-за печально известного ограничения «нескольких каскадных путей». Один из ключей не должен быть каскадным, его можно настроить только с помощью свободного API.

0
ответ дан Gert Arnold 15 January 2019 в 10:01
поделиться

Основано на отношениях - EF Core | Документы Microsoft вы можете использовать аннотации данных

аннотации данных

Существуют две аннотации данных, которые можно использовать для настройки отношений, [ForeignKey] и [InverseProperty]. [1112 ]

[ForeignKey]

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

[InverseProperty]

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

public class Team
    {
        public int Id { get; set; }
        public string Name { get; set; }

        [InverseProperty("HomeTeam")]
        public ICollection<Game> HomeGames { get; set; }

        [InverseProperty("AwayTeam")]
        public ICollection<Game> 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. Не удалось создать ограничение или индекс. Посмотрите предыдущие ошибки

, вы можете сделать HomeTeamId AwayTeamId int? обнуляемым

public class Team
    {
        public int Id { get; set; }
        public string Name { get; set; }

        [InverseProperty("HomeTeam")]
        public ICollection<Game> HomeGames { get; set; }

        [InverseProperty("AwayTeam")]
        public ICollection<Game> 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<Game> HomeGames { get; set; }
    
        [InverseProperty("AwayTeam")]
        public ICollection<Game> 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<Game> Games { get; set; }
        public DbSet<Team> 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

    <PropertyGroup>
      <OutputType>Exe</OutputType>
      <TargetFramework>netcoreapp2.1</TargetFramework>
    </PropertyGroup>
    
    <ItemGroup>
      <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.0" />
      <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.1.0" />
      <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.0" />
     </ItemGroup>
    

0
ответ дан Mohamed Elrashid 15 January 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: