【问题标题】:Problem deleting a one-to-many relationship using CodeFirst CTP5使用 CodeFirst CTP5 删除一对多关系时出现问题
【发布时间】:2011-03-10 09:46:48
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 嗨@Ladislav。如果我不使用 fluent api 配置外键,仍然会创建外键。有没有办法(使用流利的 api)避免创建外键,同时保留我的属性名称(UserId ...)?
      • 我认为这是因为默认配置的约定:NavigationPropertyNameForeignKeyDiscoveryConvention
      猜你喜欢
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 2019-07-31
      • 1970-01-01
      相关资源
      最近更新 更多