使用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外键,你将不会在你的实体中映射关系。
Hi @Ladislav。如果我没有使用流利的API配置它,外键仍然会被创建。有没有一种方法(使用流畅的api)来避免创建外键,同时保留我的属性名称(UserId ...)? – Subgurim 2011-03-12 09:50:50
我认为这是由于默认配置的约定:'NavigationPropertyNameForeignKeyDiscoveryConvention' – 2011-03-12 10:08:00