使用实体框架(1对多关系)在外键上挣扎。
的Class1:
public partial class Class1
{
public int Id { get; set; }
[ForeignKey("Class2_Id")]
public Class2 Class2{ get; set; }
...}
Class2:
public partial class Class2
{
public int Id { get; set; }
public virtual ICollection<Class1> Stuff{ get; set; }
...}
1)我尝试使用fluentAPI: 第一次尝试:
modelBuilder.Entity<Class2>().HasMany<Class1>(p => p.Stuff).WithOptional().Map(m => m.MapKey("Class2_Id")).WillCascadeOnDelete();
第二次尝试:
modelBuilder.Entity<Class1>().HasRequired(i => i.Class2).WithMany().Map(m => m.MapKey("Class2_Id"));
2)没有fluentAPI:
我以这种方式宣布了有关的Class2
字段:
[Column("Class2")]
public int Id { get; set; }
偶数(这可能毫无意义):
[ForeignKey("Class2")]
public int Id { get; set; }
我总是收到这个错误:
类型为“Class1”的属性“Class2”上的ForeignKeyAttribute无效。在。上找不到外键名称'Class2_Id' 依赖类型'Class1'。 Name值应以逗号分隔 外键属性名称列表。
知道出了什么问题吗?
提前thx。答案 0 :(得分:1)
使用流畅的api配置,您将定义单向关系,因此正确的方法是:
modelBuilder.Entity<Class2>().HasMany(p => p.Stuff)
.WithOptional(c=>c.Class2)
.Map(m => m.MapKey("Class2_Id"))
.WillCascadeOnDelete();
如果您不希望将外键作为模型类中的属性,则使用 MapKey
方法。
当您将FK列表示为实体的属性时,请使用ForeignKey
属性:
public partial class Class1
{
public int Id { get; set; }
public int? Class2_Id{ get; set; }
[ForeignKey("Class2_Id")]
public Class2 Class2{ get; set; }
}
在最后一种情况下,使用Fluent Api进行的关系配置为:
modelBuilder.Entity<Class2>().HasMany(p => p.Stuff)
.WithOptional(c=>c.Class2)
.HasForeignKey(c=>c.Class2_Id))
.WillCascadeOnDelete();