Вам нужно заменить его как WHERE clockDate = { fn CURRENT_DATE() } AND userName = 'test'
. Удалите лишний ")"
из { fn CURRENT_DATE() })
Вы должны сообщить 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.
Основано на отношениях - 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<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. Не удалось создать ограничение или индекс. Посмотрите предыдущие ошибки
blockquote>, вы можете сделать 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>