【问题标题】:Entity Framework Core - Foreign Key is NULL实体框架核心 - 外键为 NULL
【发布时间】:2021-09-03 07:21:04
【问题描述】:

我有用户和客户表。 User 表有一个 Username 的 PK 并且是 Customer 表中的一个 FK。 我想将客户和用户输入详细信息添加到数据库中,其中用户的用户名(主键)是客户表中的外键

不知道为什么客户表中的用户名(FK)为空

用户:

public class User
{
    [Key]
    public string Username { get; set; }
    public string Password { get; set; }
}

客户:

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }

    public User User { get; set; }
}

DBContext:

class StoreContext : DbContext
{
    readonly string connectionString = @"Data source=...;Integrated security=true;Initial Catalog=dbPizzaOrderingV1";

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(connectionString);
    }
    public DbSet<User> Users { get; set; }
    public DbSet<Customer> Customers { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        
    }

}

管理客户:

class ManageCustomer
{
    StoreContext context;
    public ManageCustomer()
    {
        context = new StoreContext();
    }
    public bool AddUser(User user)
    {
        context.Users.Add(user);
        context.SaveChanges();
        return true;
    }
    public bool AddCustomer(Customer customer)
    {
        context.Customers.Add(customer);
        context.SaveChanges();
        return true;
    }

计划:

 public void CreateAccount()
 {
    Customer customer = new Customer();
    User user = new User();
    Console.WriteLine("Create Account");
    Console.WriteLine("Enter Your Name: ");
    customer.Name = Console.ReadLine();
    Console.WriteLine("Enter Username: ");
    user.Username = Console.ReadLine();
    Console.WriteLine("Enter Password: ");
    user.Password = Console.ReadLine();

    manageCustomer.AddUser(user);
    manageCustomer.AddCustomer(customer);
        
    Console.WriteLine("Created Account Successfully!");
 }

用户详细信息和客户详细信息已成功添加到表中,但客户表中的用户名(FK)为空。 我该如何解决?

【问题讨论】:

    标签: c# sql entity-framework-core


    【解决方案1】:

    public string UserId { get; set; } 添加到客户类。而User 属性必须是virtual

    文档:https://docs.microsoft.com/en-us/ef/ef6/fundamentals/relationships

    【讨论】:

      【解决方案2】:

      修复类

      public class Customer
      {
          public int Id { get; set; }
          public string Name { get; set; }
      
           public string Username { get; set; }
      
          [ForeignKey(nameof(UserName))]
          [InverseProperty("Customers")]
          public virtual User User { get; set; }
      }
      public class User
      {
          [Key]
          public string Username { get; set; }
          public string Password { get; set; }
      
          [InverseProperty(nameof(Customer.User))]
          public virtual ICollection Customers {get; set;}
      }
      

      和代码

      //customer.UserName=user.UserName;
      customer.User =user;  
       manageCustomer.AddCustomer(customer);
      

      或者你也可以试试这个

       manageUser.AddUser(user);
      customer.UserName=user.UserName;
       manageCustomer.AddCustomer(customer);
      

      恕我直言,您必须添加整数 ID 作为用户表的键。没有这个 User 表看起来非常荒谬,EF 很困惑。您将无法轻松更改用户名,因为它是主键。也许您还必须添加一些流畅的 API

      【讨论】:

      • 它只在客户表中创建了另一列用户名,而不是 FK。 FK 仍然为空。
      • 您必须发布完整的 dbcontext,包括 ManageCustomer。很难理解你的问题是什么,FK 是什么?
      • 我刚刚更新了我的帖子。我想将客户输入详细信息和用户输入详细信息添加到数据库中,其中用户的用户名(主键)是客户表中的外键
      • 您必须更新类,然后将它们迁移到数据库。只有在此之后,您才能重试。
      • 尝试迁移但在 context.Users.Add(user);在 ManageCustomer 类中为“对象引用未设置为对象的实例。”
      【解决方案3】:

      我通过正确定义用户名的外键解决了这个问题

       class User
         {
              [Key]
              public string Username { get; set; }
              public string Password { get; set; }
              public virtual Customer Customer{ get; set; }
         }
      
       class Customer
          {
              public int Id { get; set; }
              public string Name { get; set; }
      
              public string Username { get; set; }
      
              [ForeignKey(nameof(Username))]
              public virtual User User { get; set; } 
          }
      

      【讨论】:

        猜你喜欢
        • 2020-07-08
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-19
        • 2021-07-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多