繁体   English   中英

为什么向我的EF4.1 CodeFirst实体添加显式外部ID列会导致外键约束冲突?

[英]Why does adding explicit foreign ID columns to my EF4.1 CodeFirst entity cause a foreign key constraint conflict?

目前我的实体使用的模型看起来像:

public class MyModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual User User { get; set; }
}

这样做很好,但我一直看到CodeFirst示例为模型中的外来实体显式创建了Id属性。 这是有道理的,所以我不必懒惰加载用户来检索与MyModel实例关联的用户的id值。

但是,当我将MyModel更改为:

public class MyModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual int UserId { get; set; }
    public virtual User User { get; set; }
}

尝试提交MyModel实例时,我收到以下异常:

System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "MyModel_User". The conflict occurred in database "mjlunittest", table "dbo.Users", column 'Id'.

为什么我得到这个例外?

当您从第一个MyModel示例MyModel到第二个示例时,EF Code-First约定会检测到一个重要更改:

在第一种情况下,模型中没有外键属性,关系MyModel -> User可选的,因为MyModel的属性User - 作为对另一个对象的引用 - 可以为null。 因此,EF约定将在数据库中创建空的外键列。

在第二种情况下,您告诉EF您的外键UserIdint类型, 不可为空 因此,EF约定规则将根据需要考虑MyModel -> User关系,并在数据库中创建一个不可为空的Int32列。

如果您创建第二个版本类型MyModel的对象,将其添加到上下文并调用SaveChanges,您将获得您描述的异常 - 除非您在数据库中有一个带有外键的用户(如果您MyModel ,则必须为0)在创建对象时指定另一个值。 创建和保存第一个版本的对象不会抛出此异常,因为此处允许数据库中的外键为null

如果您希望MyModel两个示例的行为方式相同,则可以在第二个示例中将外键属性设置为可为空:

public virtual int? UserId { get; set; }

然后,在MyModel两个示例中,该关系是可选的。

或者您可以在第一个示例中User属性:

[Required]
public virtual User User { get; set; }

然后在两个例子中都需要这种关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM