- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试删除与以下代码的关系:
var serverVideo = InternalGetVideo(db, videoId);
// get owning user
var owner = InternalGetUser(db, serverVideo.UserId);
// Add/remove video to user's upvotedVideos
if (owner.UpvotedVideos.Contains(serverVideo))
{
serverVideo.UpVotes--;
SaveChanges(db); // Works
owner.UpVotes--;
SaveChanges(db); // Works
owner.UpvotedVideos.Remove(serverVideo);
SaveChanges(db); // Breaks
}
SaveChanges(db);
但我总是得到这个错误:
The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
我不是要删除视频,我只是想将它从用户的 UpvotedVideos 属性中删除(它就在那里):
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string Username { get; set; }
public int UpVotes { get; set; }
public virtual List<Video> UpvotedVideos { get; set; }
public string Email { get; set; }
}
Videos 不包含对 UserProfiles 的引用 - 它是一对多关系。知道我做错了什么吗?
视频类:
[DataContract]
public class Video
{
[Key]
[DataMember(IsRequired = false)]
public int VideoId { get; set; }
[DataMember(IsRequired = false)]
public int UserId { get; set; } // user that created the video, unrelated
[Required]
[DataMember]
public virtual IList<Tag> Tags { get; set; }
}
最佳答案
您在源代码中的注释:
public int UserId { get; set; } // user that created the video, unrelated
不相关?这很可能是所讨论的一对多关系的外键,因为映射约定会将其检测为外键,因为它与主键属性同名UserProfile
中的 UserId
。并且由于该属性具有不可为 null 的类型 int
EF 会将这种关系检测为必需,这意味着没有用户点赞的视频就不可能存在。
这是当您从 UpvotedVideos
集合中删除视频时出现的异常,这意味着与当前点赞该视频的用户的关系已删除。您可以这样做,但是因为每个视频都必须有一个用户点赞它,所以您必须将该视频分配给另一个用户或完全删除该视频。
好吧,显然您不希望视频必须有用户对其点赞,而是视频可以没有任何点赞。在这种情况下,关系必须是可选的。您可以通过多种方式实现这一目标:
通过重命名 UserId
属性打破常规映射,例如
public int CreatorId { get; set; } // user that created the video, unrelated
现在,这个属性真的不相关,只是一个完全没有关系的标量属性。默认情况下,UpvotedVideos
集合引入的关系现在是可选的,因为它在另一端没有必需的外键属性。
使用 Fluent API 覆盖映射约定:
modelBuilder.Entity<UserProfile>()
.HasMany(u => u.UpvotedVidoes)
.WithOptional()
.Map(m => m.MapKey("UpvoterId")); // <- FK column name
引入第二个(可为空的)属性并将其定义为带有数据注释的外键:
[DataContract]
public class Video
{
[Key]
[DataMember(IsRequired = false)]
public int VideoId { get; set; }
[DataMember(IsRequired = false)]
public int UserId { get; set; } // user that created the video, unrelated
public int? UpvoterId { get; set; }
[Required]
[DataMember]
public virtual IList<Tag> Tags { get; set; }
}
在 UserProfile
中:
[ForeignKey("UpvoterId")]
public virtual List<Video> UpvotedVideos { get; set; }
可能有更多的变体,包括在 Video
中添加导航属性等。但在所有情况下,必须将关系定义为可选关系才能使您的代码正常工作。
旁注:这种关系不应该是多对多的吗?一个用户可以给很多视频点赞,一个视频可以被很多用户点赞吗?但这是另一个问题...
关于c# - 具有简单一对多的 Entity Framework "The relationship could not be changed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18410327/
编辑:为了澄清,我想问的是:在什么情况下您会更喜欢一种语法而不是另一种语法? 有什么区别: .trigger('change') 和 .change() 两者都按预期工作。在任何情况下语法都会有所不同
这个问题在这里已经有了答案: Difference between .on('click') vs .click() (12 个答案) 关闭 6 年前。 有什么区别: $('选择器').change
我用的是Select2-4.0.0 和 $gameSelect.select2().on("change",function(e){....} 工作正常。 但是当我将它链接起来时('change')就
有一天在#haskell 上,有人提到了当字符串改变时字符串的类型应该如何改变的概念。这让我想起了我项目中的一些代码。它一直困扰着我,我说不清为什么。我现在推测,原因是我没有实现这个概念。这是下面的代
我使用了 .on("change") 事件函数,因为我的整个代码中有一部分是动态变化的。 .trigger("change") 在 .change() 中工作正常,但在 .on("change") 中
下面是一个非常简单的表单下拉列表设置。但是,on-change 事件拒绝触发...除非它更改为 ng-change。 这让我卡住了大约一个小时,因为我们在网站的其他地方使用了相同的设置(即模型属性/列
我有两个v-model 案例一: 这很好用 案例二: 即使改变 u1 也会触发 onDateChange(); 最佳答案 :change 绑定(bind)属性,如 v-bind:change=
我找到了 .and方法对于链接许多期望非常有用。 expect { click_button 'Update Boilerplate' @boilerplate_original.reload
出于合规性原因,我需要捕获所有数据库更改。我知道 Change Feed 存储此信息(并且我正在等待完全保真度来捕获删除)。目前,我一直在通过 Function 触发器读取 Change Feed 并
我添加了一个data-ng-change='getSubjectsClasswise(classBean.class_id);'上课标签,但主题未在主题 处加载标签。 一切看起来都很好,没有遇到问题
我有一组复选框,当您单击其中一个时,它们应该全部被选中。 当用户单击一个复选框时,它会检查以该类名称开头的所有其他复选框。我想要的是用户单击一个复选框,并且每次单击仅触发一次 $(".atpSelec
我在 Stack Overflow 上阅读了很多有关此问题的内容,并应用了所有建议的解决方案(getShell pack、布局、getparent 布局等...),但没有一个起作用。 我有一个带有文本
我想更改我的索引。我的数据框如下: partA = pd.DataFrame({'u1': 2, 'u2': 3, 'u3':4, 'u4':29, 'u5':4, 'u6':1, 'u7':323,
我有一个像这样的下拉菜单: Grade Year 旁边还有另一个下拉菜单: 3 4
这个问题已经有人问过,但我只停留在最基本的层面上。除了选择标记和尝试通过 jquery 捕获更改事件外,我没有向我的 html 添加任何内容。这是我的代码: $('#target').bin
我只是 Django 的新手几天。现在,当自定义表单中其他字段的值发生变化时,我需要同时更改一个字段中的值和表示形式。此时更改 MyModel 是受限。 我的应用程序/models.py: class
我正在使用 ListView 控件来显示一些数据行。有一个后台任务接收列表内容的外部更新。新收到的数据可能包含更少、更多或相同数量的项目,而且项目本身可能已更改。 ListView.ItemsSour
我在 android studio 中使用 git 插件。我的问题是当我提交更改列表(公开提交)时,但我在更改列表中的评论是错误的/丢失的,我想更改它。 问题: 有没有办法通过 AndroidStud
MyCustomObject * object=new MyCustomObject(); 假设我的许多类都使用了对象指针,但突然间我想在不更改地址的情况下更改指针的内容。 我认为 object =
我正在使用新的 KeyValue Observing。当变量发生变化时,我接到了我的观察者的电话,但 change struct 附带 newValue和 oldValue都为 nil ,所以它永远不
我是一名优秀的程序员,十分优秀!