我有两个实体:
int wordCounter(char usStr[]) {
int index= 0, punct= 0;
while(usStr[index]!= '\0') { // <<< Use effin' braces
if(usStr[index]== ' ') { // <<< Use effin' braces
index++;
}
else {
break;
}
}
// index points to a non ' ' character or '\0' here
// No idea, what you're trying to achieve with the following lines
// of code.
while(usStr[index] == '\0') { // If it's the end of the sentence ...
// ... this part loops forever!
punct++;
}
int allChar = punct + index;
return allChar;
}
和
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
}
当我尝试保留public class VideoModel
{
public int Id { get; set; }
public string VideoFileName { get; set; }
public DateTime UploadedTime { get; set; }
public virtual UserProfile Owner { get; set; }
}
实体时,会出现问题:
VideoModel
由SaveChanges()方法分配给 VideoModel video = db.VideoModels.Create();
video.VideoFileName = fileName;
video.Owner = usersContext.UserProfiles.Find(WebSecurity.CurrentUserId); // CurrentUserId = 3, ok
video.UploadedTime = DateTime.Now; // video.Owner.UserId = 3
db.VideoModels.Add(video); // still 3
db.SaveChanges(); // Problem! video.Owner.UserId = 10
的新值大于先前尝试1中分配的值。当然,外键约束被破坏。为什么这个方法表现得如此奇怪?
答案 0 :(得分:1)
如果EntityFramework找到您要求其搜索的UserProfile,那么您期望的行为就是它应该如何表现。
而目前可能发生的事情是EntityFramework无法通过usersContext.UserProfiles.Find(...)找到您要求的UserProfile;而是返回null。然后,在创建VideoModel时,它会创建一个新的UserProfile,以保持参照完整性。由于对用户名没有要求(例如长度应至少为8个字符或更多),因此可以创建新用户,而不会抛出任何异常。
为了测试这个理论,在创建新的VideoModel之后立即查询数据库中的UserProfile表。我很确定正在创建一个新的UserProfile。如果有一个被创建,那么请让我知道你找到了什么。