EF Core 3.1 无法将备用键标记为可选
EF Core 3.1 Unable to mark alternate key optional
Error: The property 'UserId' on entity type 'Staff' cannot be marked
as nullable/optional because it has been included in a key {'UserId'}.
我有 Staff 实体,UserId 可以为空
public class Staff
{
public string Id { get; set; }
public string Name{ get; set; }
public string UserId { get; set; }
}
builder.Property(e => e.UserId).HasColumnName("user_id").HasMaxLength(32).IsFixedLength(true).IsRequired(false);
另一个业务实体制造商,CreatedBy 是必需的。
public class Manufacturer
{
public string Id { get; set; }
public string CreatedBy { get; set; }
public virtual Staff CreatorStaff { get; set; }
}
builder.HasOne(p => p.CreatorStaff).WithMany().HasForeignKey(p => p.CreatedBy).HasPrincipalKey(p => p.UserId);
我的查询:
var result = dbContext.Manufacturers
.Where(p => p.TenantId == tenantId)
.Where(criteria.Filters)
.OrderBy(criteria.OrderBys)
.Skip(criteria.Pager.Start)
.Take(criteria.Pager.Count)
.Select(p => new Manufacturer(p) { Creator = p.CreatorStaff == null ? null : p.CreatorStaff.Name })
.AsNoTracking()
.ToList();
好像是个bug?
Alternate Key 不允许为空,很早就讨论过了,5 年后 issue 仍然开放。业主坚持让备用钥匙可选是不合理的
您可能需要查看 this 了解详细信息
现在对我来说,使用“左连接”语法。
Error: The property 'UserId' on entity type 'Staff' cannot be marked as nullable/optional because it has been included in a key {'UserId'}.
我有 Staff 实体,UserId 可以为空
public class Staff
{
public string Id { get; set; }
public string Name{ get; set; }
public string UserId { get; set; }
}
builder.Property(e => e.UserId).HasColumnName("user_id").HasMaxLength(32).IsFixedLength(true).IsRequired(false);
另一个业务实体制造商,CreatedBy 是必需的。
public class Manufacturer
{
public string Id { get; set; }
public string CreatedBy { get; set; }
public virtual Staff CreatorStaff { get; set; }
}
builder.HasOne(p => p.CreatorStaff).WithMany().HasForeignKey(p => p.CreatedBy).HasPrincipalKey(p => p.UserId);
我的查询:
var result = dbContext.Manufacturers
.Where(p => p.TenantId == tenantId)
.Where(criteria.Filters)
.OrderBy(criteria.OrderBys)
.Skip(criteria.Pager.Start)
.Take(criteria.Pager.Count)
.Select(p => new Manufacturer(p) { Creator = p.CreatorStaff == null ? null : p.CreatorStaff.Name })
.AsNoTracking()
.ToList();
好像是个bug?
Alternate Key 不允许为空,很早就讨论过了,5 年后 issue 仍然开放。业主坚持让备用钥匙可选是不合理的 您可能需要查看 this 了解详细信息
现在对我来说,使用“左连接”语法。