我有User和Customer表。User表的PK为Username,是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(为空。我该如何修复它?
将public string UserId { get; set; }
添加到Customer类。并且User
属性必须是virtual
。
文件:https://learn.microsoft.com/en-us/ef/ef6/fundamentals/relationships
修复类
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);
IMHO您必须添加整数Id作为用户表的键。没有这个User表看起来非常激进,EF也很困惑。您将无法轻易更改用户名,因为它是一个主键。也许你将不得不添加一些流畅的API以及
我通过正确定义Username 的外键解决了这个问题
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; }
}