EF Core 3.1属性的类型为'Nullable ',当前数据库提供程序不支持此类型

问题描述 投票:0回答:1

从.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]
entity-framework-core .net-standard-2.0
1个回答
0
投票

糟糕,复制/粘贴错误-ClassMapBase的列类型为int,当我将其更改为uniqueidentifier时,它可以工作。

builder.Property(x => x.CreatedById).HasColumnType("uniqueidentifier").IsRequired().ValueGeneratedOnAdd().HasDefaultValueSql("newid()");
© www.soinside.com 2019 - 2024. All rights reserved.