我正在使用Entity Framework 4.3并首先执行代码。我有两个表是1到0或1关系的表,如...
class User
{
[key]
public int UserID {get; set;}
// other props
}
class UserStats
{
[key]
public int UserID {get; set;}
// other props
public virtual User User {get; set;}
}
我还使用ASP.Net WebAPI 2.2 w / OData v4和OData Client Code Generator模板。
WebAPI创建的元数据文件缺少用户IsNullable="False"
属性的UserID
属性。因此,OData客户端代码生成器使User类的UserID
属性可以为空,但事实并非如此,尤其是当它是主键时。
我已尝试将[Required]
添加到UserStats上的User
属性,但是如果我不在User
包含UserStats
时,任何更新都会引发验证异常保存/更新Date.now()
类。
我觉得我错过了什么。
答案 0 :(得分:1)
在一对一关系中,一端必须是委托人,另一端是依赖关系。 EF要求从属实体的PK
也为FK
。在ForeignKey
类的UserID
媒体资源上添加UserStats
属性:
public class User
{
[Key]
public int UserID {get; set;}
// other props
}
public class UserStats
{
[Key, ForeignKey("User")]
public int UserID {get; set;}
// other props
public virtual User User {get; set;}
}
如果你想要User
导航。属性是可选的,那么你将需要改变你的模型。首先,您需要向UserStats
实体添加新的PK属性,并将UserID
FK属性更改为可为空:
public class User
{
[Key]
public int UserID {get; set;}
// other props
}
public class UserStats
{
[Key]
public int UserStatsID {get; set;}
[ForeignKey("User")]
public int? UserId {get;set;}
// other props
public virtual User User {get; set;}
}
但是要小心,这最后不是一对一的关系,实际上是一对一的,但很多人使用它来做同样的建议。如果你使用Fluent Api配置这个最后的关系就是这样的:
modelBuilder.Entity<UserStats>().HasOptional(us=>us.User).WithMany().HasForeignKey(us=>us.UserId);