像 Microsoft EFCore 添加一个相关实体Demo一样,它可以正常工作。但是我将键类型更改为Guid,将实体添加到集合导航属性后,子实体状态将被修改,为什么不添加?
数据库不包含数据,因此EFCore引发更新异常。
public class Program
{
static void Main(string[] args)
{
using var dbContext = new TestDbContext();
var userId = new Guid("332DA567-1CF8-48DD-9424-1AD49FD6CF39");
//init root entity first
//var user = new AppUser(
// userId,
// "testUserName");
//dbContext.Add(user);
//dbContext.SaveChanges();
var user = dbContext.AppUsers
.Include(x => x.AppUserConfigs)
.Where(x => x.Id.Equals(userId))
.FirstOrDefault();
var userConfig = new AppUserConfig(Guid.NewGuid(),userId,"6666");
user.AppUserConfigs.Add(userConfig);
// there userConfig state is Modified, why not Added
var entries = dbContext.ChangeTracker.Entries();
// error on Save, bacause no data in database
dbContext.SaveChanges();
Console.ReadLine();
}
}
public class TestDbContext : DbContext
{
public DbSet<AppUser> AppUsers { get; set; }
public DbSet<AppUserConfig> AppUserConfigs { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Data Source =.;Initial Catalog=TestCode; User ID=sa;Password=*******;");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<AppUser>().ToTable("TB_AppUser");
modelBuilder.Entity<AppUser>().HasKey(x => x.Id);
modelBuilder.Entity<AppUser>().HasMany(x => x.AppUserConfigs).WithOne().HasForeignKey(x => x.UserId).OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity<AppUserConfig>().ToTable("TB_AppUserConfig");
modelBuilder.Entity<AppUser>().HasKey(x => x.Id);
}
}
public class AppUser
{
public Guid Id { get; protected set; }
public string UserName { get; protected set; }
public List<AppUserConfig> AppUserConfigs { get; protected set; }
protected AppUser()
{
}
public AppUser(
Guid id,
string userName)
{
Id = id;
UserName = userName;
AppUserConfigs = new List<AppUserConfig>();
}
}
public class AppUserConfig
{
public Guid Id { get; protected set; }
public Guid UserId { get; protected set; }
public string CorporationId { get; protected set; }
protected AppUserConfig()
{
}
public AppUserConfig(
Guid id,
Guid userId,
string corporationId)
{
Id = id;
UserId = userId;
CorporationId = corporationId;
}
}