【问题标题】:MVC 4 Entity Framework Optional Foreign Key On User Profile用户配置文件上的 MVC 4 实体框架可选外键
【发布时间】:2015-09-09 06:15:21
【问题描述】:

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

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 关系在我的数据库中建立,模型属性在我的控制器中设置,然后保存新的播放列表。

此时我在设置中收到以下错误:

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'.

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

【问题讨论】:

  • EF 不喜欢 1-1 关系。它想要一个 1-many。
  • 似乎应该能够处理。我想这是很多项目的要求,如果不是全部的话。
  • 你可以试试modelBuilder.Entity&lt;Playlist&gt;().HasKey(e =&gt; e.CreatedByUserID); 除了你所展示的。不过,我不确定 EF 在 1-1 的比赛中表现是否良好。
  • 哇,我认为它做到了!我需要做一些广泛的测试,但目前它似乎已经修复了。非常感谢,你是个巫师 :)

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


【解决方案1】:

只有一半的关系绑定在模型绑定器中。我不确定是否完全支持实体框架中的一对一关系,但是对于您的示例,完成关系应该可以工作

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

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

【讨论】:

  • 我不确定这是否相关,但我的联结表不适用于我在这两个表上的其他约束(多对多关系)。不会加载任何数据,当我尝试将用户添加到播放列表或将播放列表添加到用户时出现错误:INSERT 语句与 FOREIGN KEY 约束“FK_junc_UserPlaylists_Playlists”冲突。冲突发生在数据库“SyncFinder”、表“dbo.Playlists”、列“ID”中。以上是否会引入此错误?在调用 save 之前,控制器中的数据很好。
  • 当我向数据库添加新的播放列表时,保存后播放列表 ID 不是正确的 ID。在这种情况下,用户的 ActivePlaylistID 为 8,但新添加的播放列表应为 11,但检查值显示保存后为 8。我认为 EF 对所有这些限制感到非常困惑。
  • 我最终废弃了这整个部分。 EF 真的不喜欢它,删除所有这些代码后,我的联结表再次绑定。我想我必须为这 1 个属性创建一个新的连接表。似乎是一种浪费,但它比已经让人头疼的要好。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
相关资源
最近更新 更多