MVC 4实体框架用户配置文件上的可选外键

时间:2015-09-08 21:34:54

标签: c# sql-server asp.net-mvc entity-framework

在我的用户模型中,我需要一个对活动播放列表的可选约束。

public class User
{
    //.. Properties

    public int? ActivePlaylistID { get; set; }
    public virtual Playlist ActivePlaylist { get; set; }
}

在我的数据库中,我将ActivePlaylistID设置为可为空,其关系建立为:' ActivePlaylistID'是桌面上的外键'播放列表',列' ID'。

在我的播放列表模型中,我有:

public class Playlist : BaseModel
{
    //.. Properties

    public int CreatedByUserID { get; set; }
    public virtual User CreatedByUser { get; set; }
}

在我的数据库中建立了CreatedByUserID关系,并在保存新播放列表之前在我的控制器中设置了model属性。

我在设置中遇到以下错误:

Unable to determine the principal end of an association between the types 'SyncFinder.Models.Playlist' and 'SyncFinder.Models.User'. 
The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

所以在我的DbEntity中,我将以下内容添加到我的模型构建器中:

modelBuilder.Entity<User>()
    .HasOptional(x => x.ActivePlaylist)
    .WithRequired(x => x.CreatedByUser);

此时视图会加载,但在尝试将新的播放列表添加到我的数据库时,我得到:

A dependent property in a ReferentialConstraint is mapped to a store-generated column. Column: 'ID'.

我不确定如何解决此约束问题,并且堆栈跟踪不提供更多详细信息,只是在尝试保存播放列表存储库时操作失败。

1 个答案:

答案 0 :(得分:0)

只有一半的关系绑定在模型绑定器中。我不确定实体框架中对一对一关系的完全支持,但是对于你的例子,完成关系应该有效

modelBuilder.Entity<Playlist>().HasKey(e => e.CreatedByUserID);

modelBuilder.Entity<User>()
 .HasOptional(x => x.ActivePlaylist)
 .WithRequired(x => x.CreatedByUser);