首页 新闻 会员 周边

我们在EF中如果不使用外键的话

0
悬赏园豆:60 [已解决问题] 解决于 2016-07-21 10:51

我先说下,为什么我不是使用外键

主要基于一个这样的考虑,有了外键之后删除的时候,会导致一些与需求上的抵触

比如以下一个场景,班级和学生的关联表,使用外键关联,如果需要删除班级,又不想删除学生信息的话,(这种需求是有的,你不用怀疑),那么这就产生了一个纠结,(当前一般情况下,我们可以用一个flag来表示数据的状态,也就是不在数据库中真实的删除来避免这个纠结)

 

当然,如果使用外键关联,导航属性的话,那么我就不需要来写一些关联查询就能直接使用,这在很大程度上非常非常的方便,所以我不想放弃这样做

 

不过如果大家能提供下不使用外键的情况下,一些优雅的方式来关联查询的话,我也是虚心接受的,那么高人你们在实际的项目中是怎么来对待EF中的外键的呢?求给出详细的说明,求教!!!

给我一个理由的主页 给我一个理由 | 初学一级 | 园豆:17
提问于:2015-12-26 13:53
< >
分享
最佳答案
0

导航属性与数据库外键无关,导航属性是由EF的映射配置决定的。

收获园豆:60
dudu | 高人七级 |园豆:31007 | 2015-12-26 14:05

哇,dudu大哥,不配置外键的话,只使用List<Stuten> Students这种导航属性,EF会在我查询班级的时候自动填充Students吗?这个我倒是没有试过啊,准确的来说,今天以前我都是一直在使用code first 配置外键的......

给我一个理由 | 园豆:17 (初学一级) | 2015-12-26 14:21

@给我一个理由: 映射关系配置正确的话,会自动填充。属性设置为virtual,就成为导航属性,在访问这个属性时自动查询数据库进行填充。

dudu | 园豆:31007 (高人七级) | 2015-12-26 15:39

@dudu: 大大,威武,我试试

给我一个理由 | 园豆:17 (初学一级) | 2015-12-26 18:33

@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大大能指导下吗???????求解释

给我一个理由 | 园豆:17 (初学一级) | 2015-12-27 13:28

EF导航属性会自动添加外键关系,没有外键是不能用导航属性的吧

黑布丁 | 园豆:202 (菜鸟二级) | 2017-02-09 10:58
其他回答(2)
0

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;

凌晨10点13分 | 园豆:179 (初学一级) | 2018-10-15 14:47
0

楼主问题解决了吗?能否贴出代码以供学习?

displaynick | 园豆:202 (菜鸟二级) | 2020-06-16 21:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册