[英]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您的外键UserId
是int
类型, 不可为空 。 因此,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.