【问题标题】:EF CodeFirst One-to-OneEF 代码优先一对一
【发布时间】:2013-01-30 16:02:33
【问题描述】:

我找到了数千个关于 codefirst 关系的示例,但我无法完成我的示例!

很多这样的错误:

类型“BL.Objects.User”的属性“LanguageID”上的 ForeignKeyAttribute 无效。在依赖类型“BL.Objects.User”上找不到导航属性“语言”。 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)");
    }
}

谢谢!

【问题讨论】:

    标签: asp.net-mvc entity-framework-4 ef-code-first entity-relationship


    【解决方案1】:

    LanguageID 不需要使用外键

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

    【讨论】:

    • 我做到了!但现在错误是:导航属性“语言”不是“用户”类型的声明属性。验证它没有被明确地从模型中排除,并且它是一个有效的导航属性。
    【解决方案2】:

    如果还没有虚拟导航字段,请在您的用户表中添加虚拟导航字段以获取语言。 即您在 POCO 类用户中有 LanguageId 和 Language。 另一种方法是语言类中的导航字段返回用户, 即公共虚拟列表用户

    但让我们坚持使用具有 虚拟导航属性和外键 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);
    

    【讨论】:

      【解决方案3】:

      解决了。我的导航属性 Language 有 private setter

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 2015-07-29
        相关资源
        最近更新 更多