java 实体框架_实体框架 - 关系混乱

使用Entity Framework,您甚至不必指定外键关系,因为它会从模型中推导出它并相应地创建表 . 您实际需要做的唯一关系类型是0..1或1到0..1或1 .

不要忘记对象模型比数据库模型更宽松 . 您可以将属性存储在对象中但不在表中 .

您必须以不同的方式思考,因为EF将在数据库级别为您完成工作,您将可以访问对象模型中定义的所有属性,甚至是集合属性 .

我一直用来完成它的规则如下:

如果关系的基数为0..1或1,则使用对另一个实体对象的引用作为您的属性 . 如果基数很多,请使用集合 .

以下是一些用例:

1到多(每个父母很多孩子):

public class Parent

{

public int Id { get; set; }

// Navigation property

public virtual ICollection Childs { get; set; }

}

public class Child

{

public int Id { get; set; }

// Navigation property

public virtual Parent Parent { get; set; }

}

数据库中的结果将是具有单个属性(Id)的表父和具有两个属性的表Child,自动生成的Id和外键属性名为Parent_Id(表名然后是下划线,然后是相关类的键属性) ) .

多对多:

public class ClassA

{

public int Id { get; set; }

// Navigation property

public virtual ICollection ClassBs { get; set; }

}

public class ClassB

{

public int Id { get; set; }

// Navigation property

public virtual ICollection ClassAs { get; set; }

}

数据库中的结果将是具有单个属性(Id)的Table ClassA,具有单个属性(Id)的表ClassB和具有两个属性的第三个表(多对多关系的关系表)(this两个表的Ids) .

EF将推断它为了完成工作所需要的东西,所以你不必具体那么具体 .

现在,对于唯一有问题的,1比1:

public class ClassA

{

public int Id { get; set; }

// Navigation property

public virtual ClassB ClassB { get; set; }

}

public class ClassB

{

public int Id { get; set; }

// Navigation property

public virtual ClassA ClassA { get; set; }

}

遵循我在开始时给出的规则,这就是我们要做的 . 但在这种情况下,EF无法知道关系的方向......一对一的方向是两个方向 . 我们必须让它知道使用注释的方向(对我而言,与Fluent API相比最简单的方法) .

public class ClassA

{

public int Id { get; set; }

// Navigation property

public virtual ClassB ClassB { get; set; }

}

public class ClassB

{

[ForeignKey("ClassA")]

public int Id { get; set; }

// Navigation property

public virtual ClassA ClassA { get; set; }

}

ClassB中的注释[ForeignKey(“ClassA”)]告诉EF使用ClassB中的Id列作为ClassA中的外键 .

数据库中的结果将是具有2个属性(Id和ClassB_Id)的Table ClassA和具有单个属性(Id)的表ClassB .

您不必自己创建外部键属性,因为EF会为您执行此操作 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值