C# 什么';当我只设置集合时,创建代码优先关系的区别是什么

C# 什么';当我只设置集合时,创建代码优先关系的区别是什么,c#,ef-code-first,entity-framework-5,C#,Ef Code First,Entity Framework 5,我使用的是带有代码优先的实体框架5。我在编写业务逻辑时更新了模型(实体),这会导致一些问题。从现在起,当我想要创建1:N关系时,我使用了以下方法: Entity-1 { public int Entity-1ID { get; set; } public virtual ICollection<Entity-N> Entity-Ns { get; set; } } 但是最近我遇到了需要空外键的问题(我需要向一些实体添加更多的关系),因为我已经在使用GenericReposi

我使用的是带有代码优先的
实体框架5
。我在编写业务逻辑时更新了模型(实体),这会导致一些问题。从现在起,当我想要创建
1:N
关系时,我使用了以下方法:

Entity-1
{
  public int Entity-1ID { get; set; }
  public virtual ICollection<Entity-N> Entity-Ns { get; set; }
}
但是最近我遇到了需要空外键的问题(我需要向一些实体添加更多的关系),因为我已经在使用GenericRepository,其中所有类型都是值类型(没有空值),并且还基于此编写了一些代码,所以我决定现在更改这些已经太晚了

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

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

现在我有实体
页面
在哪里

Page
{
  public virtual ICollection<SomeEntity> SomeEntities { get; set; }
}
页面
{
公共虚拟ICollection SomeEntities{get;set;}
}
正如在
SomeEntity
中所预期的那样,我没有
FK
用于
页面
,但是当我查看
Microsoft SQL Management Studio
时,我看到
SomeEntity
表中有一个名为
Page\u PageID
的列


有人能告诉我当我建立这样的关系时到底发生了什么吗。为什么即使我有这个实际上充当
FK
Page\u PageID
列,我也不能从我的代码中使用它,为什么如果我显式定义
public int PageID{get;set;}
someentity
中,我尝试将
int
更改为
int?
尝试使用null时会出现各种错误,但是使用自动创建的列
Page\u PageID
可以让记录的值为null。

你的问题:有人能解释一下,当我建立关系时会发生什么像这样

Page
{
  public virtual ICollection<SomeEntity> SomeEntities { get; set; }
}
页面
{
公共虚拟ICollection SomeEntities{get;set;}
}
在代码优先中,如果两个实体之间存在集合属性,实体框架将创建一对多关系。这意味着该实体的集合属性是关系的主端,另一个实体是从属端。并且,在从属实体的表中,实体框架将生成主体表的外键。 因此,实体页面的集合属性“SomeEntities”将导致实体框架在实体“SomeEntity”表中生成外键

Code First将三种场景视为实体之间的一对一关系。
1.一个实体中有一个引用导航属性。
2.一个实体中存在集合导航属性(您的页面实体属于此实体)。
3.一个实体中存在引用导航属性,另一个实体中存在集合导航属性

你的问题:为什么即使我有这个实际上充当FK的专栏pageu PageID,我也不能从我的代码中使用它

如果要使用外键,应在实体“SomeEntity”中定义外键属性。默认情况下,实体框架使用以下模式生成外键:
[Target Type Key Name]、[Target Type Name]+[Target Type Key Name]或[Navigation Property Name]+[Target Type Key Name]。这就是外键名为“Page_PageID”的原因。您可以使用注释“ForeignKey”

你的问题是:为什么我要在某个实体中显式定义public int PageID{get;set;},然后尝试将int更改为int?尝试使用null时会出现各种错误,但是使用这个自动创建的列Page_PageID,可以让记录的值为null

默认情况下,如果主键是value-types,那么它的外键将不为null。这意味着该关系是必需的。 我看不到页面实体的键。如果它的类型为int,则自动创建的列Page_PageId(页面外键)也将不为null。是否显示了整个页面实体

如果您没有在某个实体中定义外键(如public int PageId),code first将生成一个名为pattern[Target Type Name]U[Target Type key Name]的外键,即Page_PageId。在这种情况下(依赖实体中没有外键属性),entity Framework在静默状态下生成的外键将为null。
但是,如果显式定义外键属性,如public int PageId,则数据库中外键的可空性将由外键属性的类型决定(值类型不为空)。
因此,就像您的问题一样,当您使用自动创建的FK列Page_PageID时,FK为null,您可以插入并保留它为null。当您显式定义外键属性public int PageID{get;set;}时,FK PageID将不为null,因为PageID为整数。
此外,您还可以通过将PageId指定为int?来控制数据库中FK int的可空性
属性,以确定关系是必需的还是可选的。

我建议阅读有关代码优先约定、关于我的实体
页面
-不,它有更多属性,但它的主键是显式定义的-
公共int PageID{get;set;}
Page
{
  public virtual ICollection<SomeEntity> SomeEntities { get; set; }
}