【问题标题】:How to prevent Code First from enabling foreign key constraint on a relationship?如何防止 Code First 对关系启用外键约束?
【发布时间】:2012-04-25 21:41:14
【问题描述】:

我有两个实体,用户和反馈,在用户名字段的帮助下,它们之间存在一对多的关系。

Feedback --> User 
--------   --------
username   username

但是,有时反馈可能来自未注册用户,反馈上的用户名字段将为空。在这种情况下,由于外键约束,添加反馈将失败。

如何以声明方式或通过 Fluent API 禁用对关系执行外键约束?创建数据库时默认启用。

谢谢!

【问题讨论】:

  • 我也在寻找这个确切问题的答案。

标签: entity-framework ef-code-first code-first


【解决方案1】:

您不需要出于您的目的禁用外键约束的实施,您只需要允许外键为 NULL 值,这称为 可选 一对多关系(与不允许外键为 NULL 值的 必需 关系相反)。

您可以通过以下方式定义此可选关系:

public class Feedback
{
    public int Id { get; set; }

    [ForeignKey("User")]
    public int? UserId { get; set; } 
    public User User { get; set; }
}

为外键设置可空类型int? 使关系成为可选的。如果User 有一个名为Id 的主键属性,您甚至可以省略[ForeignKey] 属性,因为Entity Framework 将根据命名约定将UserId 检测为User 导航属性的外键。

您可以使用 Fluent API 替代数据注释:

modelBuilder.Entity<Feedback>()
    .HasOptional(f => f.User)
    .WithMany() // or WithMany(u => u.Feedbacks)
    .HasForeignKey(f => f.UserId);

【讨论】:

  • 非常感谢您的回复。如果我的主键(用户名)是字符串并且不能为空怎么办?当我指定“公共字符串?用户名”时,我收到以下编译错误:类型“字符串”必须是不可为空的值类型才能将其用作泛型类型或方法“System.Nullable”中的参数“T” '.
  • @AlexAvrutin: String 是一个引用类型,因此默认允许null。您无需添加?
  • 但是如果我不添加?,我会得到默认启用的关系的外键约束。我想避免这种情况。希望您提到的 Fluent API 方法对我有所帮助?
  • @AlexAvrutin: EF always 为关系创建约束。你为什么不想要这个?因为 string 默认情况下允许 null 关系将是 optional 而不是 required 如我的回答中所述。如果数据库中没有 FK 约束,您可能会有 FK "xyz" 的行,但目标表中没有包含此键 "xyz" 的记录,这对数据库中的数据一致性非常不利。
  • 好的,谢谢。我会再检查一次。出于某种原因,我在那里有必要的关系。
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
相关资源
最近更新 更多