我先说下,为什么我不是使用外键
主要基于一个这样的考虑,有了外键之后删除的时候,会导致一些与需求上的抵触
比如以下一个场景,班级和学生的关联表,使用外键关联,如果需要删除班级,又不想删除学生信息的话,(这种需求是有的,你不用怀疑),那么这就产生了一个纠结,(当前一般情况下,我们可以用一个flag来表示数据的状态,也就是不在数据库中真实的删除来避免这个纠结)
当然,如果使用外键关联,导航属性的话,那么我就不需要来写一些关联查询就能直接使用,这在很大程度上非常非常的方便,所以我不想放弃这样做
不过如果大家能提供下不使用外键的情况下,一些优雅的方式来关联查询的话,我也是虚心接受的,那么高人你们在实际的项目中是怎么来对待EF中的外键的呢?求给出详细的说明,求教!!!
导航属性与数据库外键无关,导航属性是由EF的映射配置决定的。
哇,dudu大哥,不配置外键的话,只使用List<Stuten> Students这种导航属性,EF会在我查询班级的时候自动填充Students吗?这个我倒是没有试过啊,准确的来说,今天以前我都是一直在使用code first 配置外键的......
@给我一个理由: 映射关系配置正确的话,会自动填充。属性设置为virtual,就成为导航属性,在访问这个属性时自动查询数据库进行填充。
@dudu: 大大,威武,我试试
@dudu:
[Table("test_class")]
public class Class
{
public Class()
{
this.Students = new List<Student>();
}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public virtual List<Student> Students { get; set; }
}
[Table("test_student")]
public class Student
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
这是使用enable-migrations之后,自动生成的代码,很显然还是生成了外键
public partial class init : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.test_class",
c => new
{
Id = c.Int(nullable: false, identity: true),
Name = c.String(unicode: false),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.test_student",
c => new
{
Id = c.Int(nullable: false, identity: true),
Name = c.String(unicode: false),
Age = c.Int(nullable: false),
Class_Id = c.Int(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.test_class", t => t.Class_Id)
.Index(t => t.Class_Id);
}
public override void Down()
{
DropForeignKey("dbo.test_student", "Class_Id", "dbo.test_class");
DropIndex("dbo.test_student", new[] { "Class_Id" });
DropTable("dbo.test_student");
DropTable("dbo.test_class");
}
}
dudu大大能指导下吗???????求解释
EF导航属性会自动添加外键关系,没有外键是不能用导航属性的吧
Class A
{
//没有显示设置BId作为外键,表A中对B表的外键是自动生成的B_id
public B b { get ;set;}
}
Class B {... }
如何删除A中的b:
dbcontext.Entry(A).Reference(a => a.b).Load();
A.b= null;
楼主问题解决了吗?能否贴出代码以供学习?