2013-06-14 1 views
0

В принципе я получил следующую таблицу:Внешний ключ к одной и той же таблицы в EF - Получение ошибки

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    [Required] 
    public string UserName { get; set; } 
    [Required] 
    public string AffiliateId { get; set; } 
    [ForeignKey("UserId")] 
    public UserProfile Referer { get; set; } 
} 

Который имеет внешний ключ к себе (Referer). Проблема, однако, тот факт, что, когда я пытаюсь вставить новую строку:

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, propertyValues: new { AffiliateId = affiliateId, Referer = referer }); 

переменного «Referer» здесь является актуальной UserProfile. Я получаю следующее сообщение об ошибке: Отсутствует сопоставление типа объекта UserProfile с известным типом управляемого управляемого провайдера.

Что я делаю неправильно?

ответ

1

Я предполагаю, что вы пытаетесь ссылаться на другойUserProfile объекта как реферер, в этом случае вы не хотите использовать первичный ключ (UserId) в качестве значения, переданного атрибута ForeignKey. Вместо этого вы должны либо объявить другое свойство int, чтобы служить в качестве FK для объекта Referrer, и использовать ForeignKey, чтобы сообщить EF использовать это как FK для свойства навигации Referer или просто не использовать ForeignKey вообще и позволить генерировать EF столбец ключа для вас:

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    // ... 
    public UserProfile Referer { get; set; } // EF will generate Referer_UserId 
} 

(атрибут ForeignKey используется, чтобы указать рамки сущности, как совпасть свойство навигации с соответствующим колонке FK - это не используется для идентификации первичного ключа упомянутого объекта).

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

No mapping exists from object type UserProfile to a known managed provider native type. 

Проверьте, чтобы убедиться, что есть DbSet<UserProfile> UserProfiles определена внутри объекта DbContext в AccountModels.cs. И если ваш объект UserProfile фактически ссылается на любые другие типы, которые вы не показывали в приведенном выше примере кода, убедитесь, что для них также есть DbSet<>.

+0

Я изменил то, что вы мне сказали, и изменил строку кода на: WebSecurity.CreateUserAndAccount (model.UserName, model.Password, propertyValues: new {AffiliateId = affiliateId, Referer_UserId = referer.UserId}); Теперь это, по-видимому, работает :) –

0

Поскольку вы передаете профиль, должен ли синтаксис не быть referer.UserId?

+0

Я попытался изменить его на Referer, UserId, но теперь я получаю следующую ошибку: Недопустимое имя столбца 'Referer'. –

+0

Я вижу, что вы решили проблему, передав сущность. В моем ответе слово referrer было записано в нижнем регистре r. – Allan

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