0

コードファースト関係の例を何千も見つけましたが、サンプルを処理できません!

このような多くのエラー:

タイプ 'BL.Objects.User' のプロパティ 'LanguageID' の ForeignKeyAttribute が無効です。依存タイプ「BL.Objects.User」でナビゲーション プロパティ「Language」が見つかりませんでした。Name 値は、有効なナビゲーション プロパティ名である必要があります。

そして同じ同じ同じ...

私は本当にユーザーとの言語の関連付けをロードしたいです。(en, ru, es)

public abstract class BaseUser : FinanceBase<int>, IUser
{      
    [ForeignKey("Language")]
    public int LanguageID { get; set; }

    [ForeignKey("LanguageID")]
    public virtual Language Language { get; private set; }        

}

public class User : BaseUser
{
    public override void GenerateID()
    {
        ...
    }
}

public abstract class BaseLanguage : FinanceBase<int>, ILanguage
{
    #region Implementation of ILanguage

    public string Code { get; set; }
    public string Fullname { get; set; }
    public string ImagePath { get; set; }

    #endregion
}

public class Language : BaseLanguage
{
    public override void GenerateID()
    {

    }
}

public class FinanceDatabaseContext : DbContext
{
    public FinanceDatabaseContext()
    {
        Database.SetInitializer(new FinanceContextInitializer());    
    }

    public DbSet<User> Users { get; set; }
    public DbSet<Language> Languages { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>().Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("Users");
            }).HasKey(x => x.ID).HasRequired(x => x.Language).WithMany().HasForeignKey(x => x.LanguageID);

        modelBuilder.Entity<Language>().Map(m =>
        {
            m.MapInheritedProperties();
            m.ToTable("Languages");
        }).HasKey(x => x.ID);

        base.OnModelCreating(modelBuilder);
    } 
}

public class FinanceContextInitializer : DropCreateDatabaseIfModelChanges<FinanceDatabaseContext>
{
    protected override void Seed(FinanceDatabaseContext context)
    {
        context.Database.ExecuteSqlCommand("ALTER TABLE Users ADD CONSTRAINT uc_Language UNIQUE(LanguageID)");
    }
}

ありがとう !

4

3 に答える 3

1

外部キーを使用する必要はありませんLanguageID

    public int LanguageID { get; set; }
    [ForeignKey("LanguageID ")]
    public virtual Language Language { get; private set; }  
于 2013-01-30T16:22:42.647 に答える
0

まだ存在しない場合は、言語のユーザー テーブルに仮想ナビゲーション フィールドを追加します。つまり、POCO クラス User に LanguageId と Language があります。代替手段は、ユーザーに戻る言語クラスのナビゲーション フィールドです。つまり、Public virtual List Users です。

ただし、仮想ナビゲーション プロパティと外部キー ID フィールドの両方を持つユーザーに固執しましょう。

 ... the rest of User.....
    public int LanguageId
// nav relationship
    public virtual Language Language { set; get; }

// Now the FK declaration as you described should work in fluent API...
// Has required NAVIGATION property, its 1 to many and the I have a field for this FK value called X

modelBuilder.Entity<User>().Map(m =>
        {
            m.MapInheritedProperties();
            m.ToTable("Users");
        }).HasKey(x => x.ID).HasRequired(x => x.Language).WithMany().HasForeignKey(x => x.LanguageID);
于 2013-01-31T04:04:25.910 に答える
0

解決しました。マイ ナビゲーション プロパティの言語にはプライベートセッターがあります

[ForeignKey("LanguageID")]
public virtual Language Language { get; private set; } 
于 2013-01-31T20:36:04.940 に答える