使用CodeFirst删除一对多关系的问题CTP5

问题描述:

我正在使用CodeFirst CTP5。使用CodeFirst删除一对多关系的问题CTP5

正如你在我的代码中看到的,我有一个用户有很多问题。我希望能够删除用户但保留问题。另外,我也想保持问题

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); 
    } 
} 

问题的“用户ID”的性质是这样的配置的ModelCreating给了我这个错误:

System.Data.Edm.EdmAssociationType: : Multiplicity is not valid in Role 'Expert_Answers_Source' in relationship 'Expert_Answers'. Because all the properties in the Dependent Role are nullable, multiplicity of the Principal Role must be '0..1'

我在做什么错?我怎么才能得到它?

正如拉迪斯拉夫所说,这是不可能的,但你可以尝试通过在Question类中添加一个额外的用户ID属性(将相应的列添加到你的问题表中)并将其命名为RefUserId或OriginalPoster,或任何你喜欢的。您可以手动填写此属性,并且不会将其用作外键

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

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

+0

Hi @Ladislav。如果我没有使用流利的API配置它,外键仍然会被创建。有没有一种方法(使用流畅的api)来避免创建外键,同时保留我的属性名称(UserId ...)? – Subgurim 2011-03-12 09:50:50

+0

我认为这是由于默认配置的约定:'NavigationPropertyNameForeignKeyDiscoveryConvention' – 2011-03-12 10:08:00