如何正确初始化enGyerek实体的非空外键enSzulo_Id?
正确初始化enGyerek实体外键的两种方法
看来你在EF(Entity Framework)中初始化实体时卡在外键赋值这一步了,我先帮你分析下之前的错误写法问题:
enSzulo.Id=2:enSzulo是导航属性,默认值是null,直接访问它的Id会触发NullReferenceException,肯定行不通;enSzulo=2:类型不匹配,enSzulo是enSzulo类型的对象,不能直接给它赋值整数;enSzulo_Id=2:如果报错,大概率是你的enGyerek实体类里没有显式定义这个外键属性,或者属性名的拼写、大小写和数据库映射的不一致。
下面分两种常见场景给你解决方案:
场景1:实体类中显式定义了外键属性enSzulo_Id
如果你的enGyerek实体类是类似下面这样(同时包含外键字段和导航属性):
public class enGyerek { public int Id { get; set; } public string gy_nev { get; set; } public string gy_kor { get; set; } // 显式外键属性 public int enSzulo_Id { get; set; } // 关联的导航属性 public enSzulo enSzulo { get; set; } }
那直接给enSzulo_Id赋值就是最直接的写法:
var er = new enGyerek() { gy_nev = tbGyereknev.Text, gy_kor = tbGyerekkor.Text, enSzulo_Id = 2 // 直接赋值外键ID即可 };
如果还是报错,检查下外键属性的名称是否和数据库列名一致,或者是否通过Data Annotation/Fluent API正确映射了外键:
- Data Annotation方式(给外键加特性标记):
[ForeignKey("enSzulo")] // 指定关联的导航属性 public int enSzulo_Id { get; set; } public enSzulo enSzulo { get; set; } - Fluent API方式(在DbContext的
OnModelCreating方法中配置):modelBuilder.Entity<enGyerek>() .HasOne(e => e.enSzulo) .WithMany() // 如果enSzulo有对应的集合导航属性,这里替换为对应的属性名,比如s => s.enGyerekek .HasForeignKey(e => e.enSzulo_Id);
场景2:实体类只有导航属性enSzulo,没有显式外键
如果你的enGyerek实体类只定义了导航属性:
public class enGyerek { public int Id { get; set; } public string gy_nev { get; set; } public string gy_kor { get; set; } // 仅包含导航属性,无显式外键字段 public enSzulo enSzulo { get; set; } }
这时候需要关联一个enSzulo实体对象,有两种实现方式:
方式1:从数据库查询对应的父实体
// 假设你的DbContext实例是db var szulo = db.enSzulo.Find(2); // 根据ID查询父实体 var er = new enGyerek() { gy_nev = tbGyereknev.Text, gy_kor = tbGyerekkor.Text, enSzulo = szulo // 关联查询到的实体 };
方式2:Attach一个实体(避免查询数据库)
如果不想额外查询数据库,可以创建一个仅包含ID的父实体,然后Attach到上下文(告诉EF这个实体已经存在于数据库中):
var szulo = new enSzulo { Id = 2 }; db.enSzulo.Attach(szulo); // 将实体附加到上下文 var er = new enGyerek() { gy_nev = tbGyereknev.Text, gy_kor = tbGyerekkor.Text, enSzulo = szulo };
内容的提问来源于stack exchange,提问作者Spoty
相关产品推荐
相关产品推荐

