我正在使用CodeFirst CTP5。
正如您在我的代码中看到的,我有一个有许多问题的用户。我希望能够删除用户但保留问题。另外,我还想保留问题的“UserId”属性
public class User
{
public User()
{
Questions = new List<Question>();
}
public virtual string UserId { get; set; }
public virtual ICollection<Question> Questions { get; set; }
}
public class Question
{
public virtual string QuestionId { get; set; }
public virtual string Title { get; set; }
public virtual string Text { get; set; }
public User User { get; set; }
public string UserId { get; set; }
}
public class DB : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Question> Questions { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(u => u.Questions)
.WithRequired(q => q.User)
.HasForeignKey(q => q.UserId)
.WillCascadeOnDelete(false);
}
}
问题是像这样配置ModelCreating会给我这个错误:
System.Data.Edm.EdmAssociationType :: 多重性在角色中无效 'Expert_Answers_Source'中 关系'Expert_Answers'。因为 Dependent中的所有属性 角色是可空的,多样性的 主要角色必须为“0..1”
我做错了什么?我怎么能得到它?
答案 0 :(得分:1)
这是不可能的。一旦您定义了外键,您就无法删除用户并仍然使用他的ID。如果您删除用户,他的ID将在Question
中设置为空。它不是关于EF,而是关于数据库中的引用完整性。如果您不希望发生这种情况,则无法将UserId
中的Question
定义为外键。如果不将其定义为db外键,则不会在实体中映射关系。
答案 1 :(得分:1)
正如Ladislav所说,这是不可能的,但是您可以尝试通过向Question类添加额外的User Id属性(使用Question表的相应列)来解决它,并将其命名为RefUserId或OriginalPoster,或者随你喜欢。您手动填写此属性,不将其用作外键。
然后,在删除用户之前,只需在Question对象上将User
属性设置为null
,然后删除该用户。这应该使问题在数据库中保持完整,并且您仍然可以引用发布问题的用户。