0

I am using ASP.NET Core and Entity Framework 7. I have a deck class and a card class. I am trying to create a code first DB with a many to many relationship and an additional field - count of each card in the deck. This is my code.

Deck class:

public class Deck
{
    public int DeckId { get; set; }
    [Required]
    [MinLength(8)]
    public string Name { get; set; }
    public string Description { get; set; }
    public short Score { get; set; }
    [HasHeroValidate]
    public Hero Hero { get; set; }

    public short AspectOrder { get; set; }
    public short AspectWisdom { get; set; }
    public short AspectNature { get; set; }
    public short AspectRage { get; set; }
    public short AspectDominion { get; set; }
    public short AspectCorruption { get; set; }

    [CardCountValidate]
    public ICollection<DeckCard> DecksCards { get; set; }
    public ICollection<Comment> Comments { get; set; }
}

Card class:

public class Card
{
    public int CardId { get; set; }
    public String Name { get; set; }
    public String ImgUri { get; set; }
    public short ManaCost { get; set; }
    public CardType CardType { get; set; }

    public short AspectOrder { get; set; }
    public short AspectWisdom { get; set; }
    public short AspectNature { get; set; }
    public short AspectRage { get; set; }
    public short AspectDominion { get; set; }
    public short AspectCorruption { get; set; }

    public ICollection<DeckCard> DecksCards { get; set; }
}

DeckCard class:

public class DeckCard
{
    public int DeckId { get; set; }
    public int CardId { get; set; }

    public Deck Deck { get; set; }
    public Card Card { get; set; }

    public short Count { get; set; }
}

DBcontext :

public sealed class SwDbContext :IdentityDbContext<SwdUser>
{
    private static bool _created = false;
    public SwDbContext()
    {
        if (!_created)
        {
            _created = true;
            Database.EnsureCreated();
        }
    }

    public DbSet<Deck> Decks { get; set; }
    public DbSet<Card> Cards { get; set; }
    public DbSet<Hero> Heroes { get; set; }
    public DbSet<Comment> Comments { get; set; }
    public DbSet<DeckCard> DeckCards { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<SwdUser>().HasMany(u => u.Comments).WithOne(c => c.User);
        modelBuilder.Entity<Deck>().HasMany(d => d.Comments).WithOne(c => c.Deck);
        modelBuilder.Entity<DeckCard>().HasKey(x => new {x.DeckId, x.CardId});
        base.OnModelCreating(modelBuilder);
    }
}

Packages :

dependencies": {
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
    "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
    "Microsoft.Framework.DependencyInjection": "1.0.0-beta8",
    "EntityFramework.Commands": "7.0.0-rc1-final",
    "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.UserSecrets": "1.0.0-rc1-final",
    "Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",
    "Microsoft.AspNet.Authorization": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
    "Serilog.Framework.Logging": "1.0.0-rc1-final-10078",
    "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
    "Microsoft.AspNet.Diagnostics": "1.0.0-rc1-final",
    "EntityFramework.Core": "7.0.0-rc1-final",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final"

Unfortunately, this creates a table with additional IDs : DeckId, CardId, DeckDeckId, CardCardId

I have also tried the approach suggested here, but then the

dnx ef migrations add

command gives me an error that I should use fluent api instead of attributes and the DB can't even be created. There is no HasForeignKey() method in EF7, so I can't try that.

Am I doing something wrong or is this not yet implemented in EF 7?

Community
  • 1
  • 1
t_tsekov
  • 177
  • 3
  • 11
  • What do you mean? HasOne on which property? – t_tsekov Mar 20 '16 at 13:16
  • Your scenario here is somewhat similar to your Deck <- Comment -> User relation, which you've already configured. So you should be able to solve it using pretty much the same pattern (assuming I havn't missed something): modelBuilder.Entity().HasMany(d => d.DeckCard).WithOne(c => c.Deck); modelBuilder.Entity().HasMany(d => d.DeckCard).WithOne(c => c.Card); – Nikolaj Dam Larsen Mar 21 '16 at 23:23

1 Answers1

0

This is very weird, but it seems there was no problem with the code. I had to reinstall Windows due to some file ownership problems and although the DNVM, Visual Studio and ASP .NET version are exactly the same, this now works as intended with no code or package changes.

t_tsekov
  • 177
  • 3
  • 11