2015-12-28 4 views
6

Я получаю эти ошибки при попытке создать продавца.EntityType 'IdentityUserLogin' не имеет определенного ключа. Определите ключ для этого EntityType

FlavorPing.Models.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType. 

FlavorPing.Models.IdentityUserRole: : EntityType 'IdentityUserRole' has no key defined. Define the key for this EntityType. 

UserLogins: EntityType: EntitySet 'UserLogins' is based on type 'IdentityUserLogin' that has no keys defined. 

UserRoles: EntityType: EntitySet 'UserRoles' is based on type 'IdentityUserRole' that has no keys defined." 

Вот мой коммерсант модель:

namespace FlavorPing.Models 
{ 
    public class Merchant 
    { 
     //Meant to inherit identity. 
     //[ForeignKey("ApplicationUserId")] 
     public string ApplicationUserId { get; set; } 
     [ForeignKey("ApplicationUser")] 
     public virtual List<ApplicationUser> ApplicationUser { get; set; } 


     [Key] 
     public int MerchantID { get; set; } 

     [Required] 
     [Display(Name = "Business Name")] 
     public string MerchantName { get; set; } 

     [Required] 
     [Display(Name = "Email")] 
     [DataType(DataType.EmailAddress)] 
     public string email { get; set; } 

     //need to create formatting here. 
     [Required] 
     [Display(Name = "Web Site Link")] 
     public string website { get; set; } 

     //public int MenuItemID { get; set; } 


     public virtual List<MenuItem> MenuItems { get; set; } 

     public virtual MerchantDetails MerchantDetails { get; set; } 

     public ICollection<FollowerMenuItemMerchant> FollowerMenuItemMerchants { get; set; } 
    } 
} 

Вот создать контроллер для торговца, который где я получаю сообщение об ошибке:

// POST: Merchants/Create 
// To protect from overposting attacks, please enable the specific properties you want to bind to, for 
// more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "MerchantID,MerchantName,email,website")] Merchant merchant) 
{ 
    if (ModelState.IsValid) 
    { 
     merchant.ApplicationUserId = User.Identity.GetUserId(); 
     db.Merchants.Add(merchant); 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 

    return View(merchant); 
} 

Вот мой DbContext:

namespace FlavorPing.Models 
{ 
    public class FlavorPingContext : IdentityDbContext 
    { 

     public FlavorPingContext() 
      : base("name=FlavorPingContext") 
     { 
     } 

     public System.Data.Entity.DbSet<FlavorPing.Models.Merchant> Merchants { get; set; } 

     public System.Data.Entity.DbSet<FlavorPing.Models.MenuItem> MenuItems { get; set; } 

     public System.Data.Entity.DbSet<FlavorPing.Models.MerchantDetails> MerchantDetails { get; set; } 

     public System.Data.Entity.DbSet<FlavorPing.Models.Follower> Followers { get; set; } 

     public System.Data.Entity.DbSet<FlavorPing.Models.FollowerMenuItemMerchant> FollowerMenuItemMerchants { get; set; } 

     public DbSet<IdentityUserLogin> UserLogins { get; set; } 
     public DbSet<IdentityUserClaim> UserClaims { get; set; } 
     public DbSet<IdentityUserRole> UserRoles { get; set; } 

     protected override void OnModelCreating(DbModelBuilder builder) 
     { 
      // Primary keys 
      builder.Entity<Follower>().HasKey(q => q.FollowerID); 
      builder.Entity<MenuItem>().HasKey(q => q.MenuItemID); 
      builder.Entity<Merchant>().HasKey(q => q.MerchantID); 
      builder.Entity<FollowerMenuItemMerchant>().HasKey(q => 
       new 
       { 
        q.FollowerID, 
        q.MenuItemID, 
        q.MerchantID 
       }); 

      // Relationships 
      builder.Entity<FollowerMenuItemMerchant>() 
       .HasRequired(t => t.Follower) 
       .WithMany(t => t.FollowerMenuItemMerchants) 
       .HasForeignKey(t => t.FollowerID); 

      builder.Entity<FollowerMenuItemMerchant>() 
       .HasRequired(t => t.MenuItem) 
       .WithMany(t => t.FollowerMenuItemMerchants) 
       .HasForeignKey(t => t.MenuItemID); 

      builder.Entity<FollowerMenuItemMerchant>() 
      .HasRequired(t => t.Merchant) 
      .WithMany(t => t.FollowerMenuItemMerchants) 
      .HasForeignKey(t => t.MerchantID); 


      builder.Conventions.Remove<PluralizingTableNameConvention>(); 
      builder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 


     } 
    } 
} 

Я тр ying, чтобы следовать примеру (option2) по этой ссылке: EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType

Я пытаюсь Вариант 2, потому что я хочу избежать двух БД. Но я новичок в управлении БД, поэтому, если вы думаете, что я должен сделать вариант 3, пожалуйста, сообщите, почему, или если вы видите, почему я получаю эту ошибку, пожалуйста, скажите мне, почему. Заранее спасибо!

+1

Вы определили PK для таблиц, которые вы упомянули? –

+0

Да, например, у следователя: [Key] public int FollowerID {get; задавать; } –

+0

Вариант 2 - самый простой вариант. Действуй. –

ответ

0

Я думаю, вы получите ошибки, потому что ваши иностранные ключевые атрибуты не в правильном месте (и имеют неправильное имя), вместо этого:

public string ApplicationUserId { get; set; } 
[ForeignKey("ApplicationUser")] 
public virtual List<ApplicationUser> ApplicationUser { get; set; } 

Вы должны сделать это:

[ForeignKey("ApplicationUser")] 
public string ApplicationUserId { get; set; } 

public virtual List<ApplicationUser> ApplicationUser { get; set; } 

Идентификатор - это внешний ключ виртуального объекта, а не наоборот.

+0

Ничего себе, это была ошибка, которую я полностью забыл, спасибо! –

+0

Не забудьте отметить ответ как принятый, если ваша проблема решена :) –

+0

На самом деле, в любом случае это сработает, но вы должны указать правильное свойство. В коде OP это должно быть '[ForeignKey (" ApplicationUserId ")]', подразумевая, что свойство навигации имеет 'ApplicationUserId', поскольку это внешний ключ. –

15

Хорошо, я исправил свою проблему, добавив это в мой класс DBContext.

builder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId); 
    builder.Entity<IdentityRole>().HasKey<string>(r => r.Id); 
    builder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId }); 
+0

Это сработало для меня. Благодаря! – veyselsahin

Смежные вопросы

 Смежные вопросы