从.net Framework EF 6.4移过来,多年来做了类似的事情。只是尝试在SQL Server db中使用Guid数据类型,但出现此错误-这应该正常工作,对吧?如果我在DbContext.OnModelCreating中删除applyconfiguration,则它可以工作(必须使用默认设置)。System.InvalidOperationExceptionHResult = 0x80131509Message =属性“ User.CreatedById”的类型为“ Nullable”,当前数据库提供程序不支持该属性。使用'[NotMapped]'属性或'OnModelCreating'中的'EntityTypeBuilder.Ignore'更改属性CLR类型或忽略该属性。来源= Microsoft.EntityFrameworkCore
注意:不想在类上使用EF属性来保持实体类的整洁,并且不需要依赖EF核心包。
public interface IEntity : INotifyPropertyChanged
{
Guid? CreatedById { get; set; }
DateTime CreatedOn { get; set; }
Guid Id { get; set; }
}
public class EntityBase : NotifyPropertyChangedBase, IEntity
{
public Guid? CreatedById { get; set; }
public DateTime CreatedOn { get; set; }
public Guid Id { get; set; }
}
public class User : EntityBase
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
public abstract class ClassMapBase<TEntity> : IEntityTypeConfiguration<TEntity>
where TEntity : class, IEntity, new()
{
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
builder.HasKey(x => x.Id);
builder.Property(x => x.Id).HasColumnType("uniqueidentifier").IsRequired().ValueGeneratedOnAdd().HasDefaultValueSql("newid()");
builder.Property(x => x.CreatedOn).HasColumnType("datetime").IsRequired();
builder.Property(x => x.CreatedById).HasColumnType("int").IsRequired().ValueGeneratedOnAdd().HasDefaultValueSql("newid()");
}
}
public class UserClassMap : ClassMapBase<User>
{
public override void Configure(EntityTypeBuilder<User> builder)
{
base.Configure(builder);
builder.Property(x => x.Email);
builder.Property(x => x.LastName).IsRequired();
builder.Property(x => x.FirstName).IsRequired();
}
}
public class LaaDbContext : DbContext, ILaaDbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
base.OnModelCreating(modelBuilder);
}
public DbSet<User> Users { get; set; }
public IList<User> GetUsers()
{
return Set<User>().AsNoTracking().ToList();
}
}
创建表的SQL Server脚本:
CREATE TABLE [dbo].[Users](
[Id] [uniqueidentifier] NOT NULL CONSTRAINT [DF_Users_Id] DEFAULT (newid()),
[Email] [nvarchar](256) NOT NULL,
[FirstName] [nvarchar](128) NOT NULL,
[LastName] [nvarchar](128) NOT NULL,
[CreatedOn] [datetime] NOT NULL CONSTRAINT [DF_Users_CreatedOn] DEFAULT (getdate()),
[CreatedById] [uniqueidentifier] NULL,
CONSTRAINT [PK_dbo.Users] PRIMARY KEY CLUSTERED ([Id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
糟糕,复制/粘贴错误-ClassMapBase的列类型为int,当我将其更改为uniqueidentifier时,它可以工作。
builder.Property(x => x.CreatedById).HasColumnType("uniqueidentifier").IsRequired().ValueGeneratedOnAdd().HasDefaultValueSql("newid()");