2

我遇到了一些問題,導致一組實體設置正常工作。我在VS2012中針對SQL Server 2008 R2 Express使用EF v5。插入實體框架一對一關係錯誤

對於生成的數據庫,一切似乎都正確,但我沒有成功寫入某些表。

我定義了一個UserProfile對象,如:

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    public long UserId { get; set; } 

    [StringLength(56)] 
    public string UserName { get; set; } 

    public Country Country { get; set; } 
    ... 
} 

我也有Country實體定義如下:

[Table("Country")] 
public class Country 
{ 
    [Key] 
    public int Id { get; set; } 

    [StringLength(2)] 
    public string CountryCode { get; set; } 

    [StringLength(100)] 
    public string CountryName { get; set; } 

    public ICollection<UserProfile> UserProfiles { get; set; } 
    ... 
} 

生成列在數據庫看起來是正確的,如果我劇本出來它看起來不錯:

ALTER TABLE [dbo].[UserProfile] WITH CHECK ADD CONSTRAINT [UserProfile_Country] FOREIGN KEY([Country_Id]) 
REFERENCES [dbo].[Country] ([Id]) 
GO 

僅用於測試目的在控制器的行動我有以下幾點:

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new 
{ 
    Country = new Country { Id = 223, CountryCode = "UK", CountryName = "UK" }, 
    ... 
}); 

當執行該WebSecurity方法我收到以下錯誤:

No mapping exists from object type MyApi.Data.Entities.Country to a known managed provider native type.

我試圖建立一個配置文件來指定代碼的關係,以及作爲數據庫,但它仍然不友好。

的配置是這樣的:

public class CountryEntityConfig : EntityTypeConfiguration<Country> 
{ 
    public CountryEntityConfig() 
    { 
     this.HasMany(x => x.UserProfiles) 
      .WithRequired() 
      .HasForeignKey(FKey => FKey.Country);    
    } 
} 

感覺非常奇怪其在該國的對象會收到一些基本知識完全不對本的配置文件列表?任何輸入讚賞。

編輯:

我再談一些類,並提出了一些修改,在用戶配置文件我現在有:

public int CountryId { get; set; } 

    public virtual Country Country { get; set; } 

Country.cs

public class Country 
{ 
    public int CountryId { get; set; } 

    [StringLength(2)] 
    public string CountryCode { get; set; } 

    [StringLength(100)] 
    public string CountryName { get; set; } 

    public virtual ICollection<UserProfile> UserProfiles { get; set; } 
} 

而且數據庫現在在UserProfile表中包含兩個與Country表關聯的CountryId相關字段,我仍然得到原始錯誤m essage。

TIA,

回答

1

無貼圖錯誤可能是因爲你沒有國家實體添加到的DbContext。

在AccountModels.cs文件中,您將找到一個從DbContext派生的UsersContext,在那裏您必須添加一個DbSet<Country>

但是,這裏還有其他問題。例如,您正在使用Key創建您的國家/地區表,而EF默認情況下會爲Country表提供自動生成的標識列。這意味着你不能爲ID插入一個值,它會自動生成。

國家可能是一個查找表,無論如何,你將填充國家的價值觀。因此,您可能只需將CountryId設置爲所需國家/地區的值

+1

Country實體已位於DbContext中。我見過的例子總是使用類的實例而不是Id屬性。你的意思是我需要在UserProfile類中包含'int CountryId'屬性並讓EF解決它? – Jammer

+0

@Jammer - 你告訴EF你想插入一個新的國家,因爲你正在創建一個新的國家對象。雖然你可以做到這一點,但這可能不是你想要的。如果你這樣做,你不能提供一個ID,因爲ID是自動生成的。如果你只是想創建一個用戶並分配一個ID,那麼你應該通過用戶的CountryID屬性來分配它。 –

+0

@Jammer - 從描述中可以清楚地看到,您已將Country表添加到DbContext。 –