您好,我尝试使用实体框架(代码优先)访问我的旧数据库。 我遇到了数据库不使用外键的问题......
public class CUSTOMERS
{
public int CUSTOMERID { get; set; }
public string NAME{ get; set; }
}
public class INVOICES
{
public int INVOICEID{ get; set; }
public int CUSTOMERID{ get; set; }
public virtual CUSTOMERS CUSTOMERS { get; set; }
}
public class INVOICEContext : DbContext
{
public DbSet<CUSTOMERS> CUSTOMERS{ get; set; }
public DbSet<INVOICES> INVOICES{ get; set; }
public INVOICEContext(DbConnection connectionString) : base(connectionString, false)
{
Database.SetInitializer<INVOICEContext>(null);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
/*modelBuilder.Entity<INVOICES>().HasRequired(b => b.CUSTOMERS)
.WithMany()
.Map(p => p.MapKey("INVOICEID"));*/ //Doesn't work because INVOICEID is defined
modelBuilder.Entity<INVOICES>().HasKey(a => new { a.INVOICEID, a.CUSTOMERID});
modelBuilder.Entity<CUSTOMERS>().HasKey(a => new { a.CUSTOMERID });
base.OnModelCreating(modelBuilder);
}
}
通常情况下,我可以从类CUSTOMERID
中删除属性INVOICES
,但在这种情况下,它是主键的一部分......
我发现许多帖子建议使用IsIndependent
,但似乎是removed from the Entity Framework 5 (or 4.1)。
我希望你能理解我可怜的英语,也许可以暗示我做错了什么^^
答案 0 :(得分:1)
我不知道“数据库不使用外键”是什么意思。所以,也许以下不是您正在寻找的答案。但是,如果您将...MapKey...
替换为HasForeignKey
并使用CUSTOMERID
代替INVOICEID
作为外国人,我可以说您可以使用代码中已注释掉的关系映射关键属性:
modelBuilder.Entity<INVOICES>()
.HasRequired(b => b.CUSTOMERS)
.WithMany()
.HasForeignKey(b => b.CUSTOMERID);
在我看来,模型和映射的其余部分都很好。您的关系是标识关系(这意味着外键是复合主键的一部分),它是与实体框架的有效映射。
答案 1 :(得分:1)
试试这个......
modelBuilder.Entity<INVOICES>()
.HasRequired(i => i.CUSTOMERS)
.WithMany()
.HasForeignKey(i => i.CUSTOMERID);