使用CodeFirst CTP5删除一对多关系时出现问题

时间:2011-03-10 09:46:49

标签: c# entity-framework-4 ef-code-first code-first

我正在使用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”

我做错了什么?我怎么能得到它?

2 个答案:

答案 0 :(得分:1)

这是不可能的。一旦您定义了外键,您就无法删除用户并仍然使用他的ID。如果您删除用户,他的ID将在Question中设置为空。它不是关于EF,而是关于数据库中的引用完整性。如果您不希望发生这种情况,则无法将UserId中的Question定义为外键。如果不将其定义为db外键,则不会在实体中映射关系。

答案 1 :(得分:1)

正如Ladislav所说,这是不可能的,但是您可以尝试通过向Question类添加额外的User Id属性(使用Question表的相应列)来解决它,并将其命名为RefUserId或OriginalPoster,或者随你喜欢。您手动填写此属性,不将其用作外键

然后,在删除用户之前,只需在Question对象上将User属性设置为null,然后删除该用户。这应该使问题在数据库中保持完整,并且您仍然可以引用发布问题的用户。

相关问题