gpt4 book ai didi

c# - 当我创建 Code First 关系时只设置一个集合有什么区别

转载 作者:太空宇宙 更新时间:2023-11-03 13:30:38 25 4
gpt4 key购买 nike

我正在将 Entity Framework 5 与 Code First 结合使用。我在编写导致某些问题的业务逻辑时更新了我的模型(实体)。从现在开始,当我想创建 1 : N 关系时,我一直在使用这种方法:

Entity-1
{
public int Entity-1ID { get; set; }
public virtual ICollection<Entity-N> Entity-Ns { get; set; }
}

Entity-N
{
public int Entity-NID { get; set; }
public int Entity-1ID { get; set; }
public virtual Entity-1 Entity-1 { get; set; }
}

bur 最近我遇到了需要 null 外键的问题(我需要向某些实体添加更多关系),因为我已经在使用 GenericRepository,其中所有类型都是值类型(不可为空)并且还编写了一些代码基于此,我决定改变这一切为时已晚。

因为我已经有了某个实体的外键,我需要将该实体与一个新实体相关联,所以我遇到了一个问题。

我的解决方案是 - 当我有一个新实体时,我只将现有实体的集合添加到新实体(或反之亦然)。困扰我的是——如果我使用它可能会导致什么样的问题。

现在我有实体 Page 在哪里

Page
{
public virtual ICollection<SomeEntity> SomeEntities { get; set; }
}

正如在 SomeEntity 中预期的那样,我没有 PageFK 但是当我查看 Microsoft SQL Management Studio 我看到 SomeEntities 表有一个名为 Page_PageID 的列。

有人能解释一下当我建立这样的关系时到底发生了什么吗?为什么即使我有这个列 Page_PageID 实际上充当 FK 我不能在我的代码中使用它,为什么如果我明确定义 public int PageID { get ;放; }SomeEntitiy 中,我尝试将 int 更改为 int? 我在尝试使用 null 时遇到了各种错误,但是这个自动创建的列 Page_PageID 有空值的记录没有问题。

最佳答案

你的问题:有人能解释一下当我建立这样的关系时到底发生了什么吗?

Page
{
public virtual ICollection<SomeEntity> SomeEntities { get; set; }
}

在Code First中,如果两个实体之间存在集合属性,Entity Framework会创建一对多的关系。这意味着具有集合属性的实体是关系的主体端,另一个实体是从属端结束。并且,在依赖实体的表中,Entity Framework 将生成一个指向主体表的外键。所以,实体Page的集合属性“SomeEntities”会导致Entity Framework在实体“SomeEntity”的表中生成一个外键。

Code Frist 将三种场景视为实体之间的一对多关系。
1.在一个实体中有引用导航属性。
2.在一个实体中有一个集合导航属性(你的Page实体属于这个)。
3.一个实体中有引用导航属性,另一个实体中有集合导航属性。

您的问题:为什么即使我有这个实际上充当 FK 的列 Page_PageID,我也不能在我的代码中使用它。

如果你想使用外键,你应该在实体“SomeEntity”中定义一个外键属性。默认情况下, Entity Framework 生成一个具有以下模式的外键:
[目标类型键名],[目标类型名] + [目标类型键名],或[导航属性名] + [目标类型键名]。这就是为什么你的外键名为“Page_PageID”。你可以使用注释“外键”。

你的问题:为什么如果我显式定义 public int PageID { get;放;在 SomeEntitiy 中,我尝试将 int 更改为 int?我在尝试使用 null 时遇到了各种错误,但是对于这个自动创建的列 Page_PageID 来说,拥有带有空值的记录没有问题..

默认情况下,如果主键是值类型,它的外键将不为空。这意味着需要关系。我看不到您的 Page 实体的键。如果它的类型是 int,则自动创建的列 Page_PageId(Page 的外键)也不会为 null。您是否显示了整个 Page 实体?

如果您没有在 SomeEntity 中定义外键(如 public int PageId),code first 将生成一个以模式 [Target Type Name]_[Target Type Key Name] 命名的外键,即 Page_PageId。在此case(依赖实体中没有外键属性),Entity Framework静默生成的外键将为null。
但是如果你显式定义一个外键属性,比如public int PageId,数据库中外键的可空性将由外键属性的类型决定(值类型不为空)。
所以,就像你的问题一样,当你使用自动创建的 FK 列 Page_PageID 时,FK 为空,你可以插入保留它为空。当你显式定义外键属性时,public int PageID { get;放; },FK PageId 不会为空,因为 PageId 是整数。
还有一些,您可以通过将 PageId 指定为 int? 来控制 FK int 数据库的可空性。同样,按照惯例,Code First 使用外键的可空性类中的属性以确定关系是必需的还是可选的。

关于c# - 当我创建 Code First 关系时只设置一个集合有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20685432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com