微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – EF Core 2.0 – System.NotSupportedException On添加[复制]

参见英文答案 > Entity Framework not including columns with default value in insert into query                                    2个
我正在使用EF Core 2.0.我有一个包含4列的表格,其中PK由所有4列组成.其中一列(IsDefault)是数据库中的位字段.如果我插入一个IsDefault设置为true的记录,一切正常.如果我将IsDefault设置为false的记录插入,则会出现以下异常:

System.NotSupportedException occurred
  HResult=0x80131515
  Message=The 'IsDefault' on entity type 'ChromeMileageRestrictionTest' does not have a value set and no value generator is available for properties of type 'bool'. Either set a value for the property before adding the entity or configure a value generator for properties of type 'bool'.
  Source=<Cannot evaluate the exception source>
  StackTrace:
   at Microsoft.EntityFrameworkCore.ValueGeneration.ValueGeneratorSelector.Create(IProperty property,IEntityType entityType)
   at Microsoft.EntityFrameworkCore.ValueGeneration.RelationalValueGeneratorSelector.Create(IProperty property,IEntityType entityType)
   at Microsoft.EntityFrameworkCore.ValueGeneration.Internal.sqlServerValueGeneratorSelector.Create(IProperty property,IEntityType entityType)
   at Microsoft.EntityFrameworkCore.ValueGeneration.ValueGeneratorSelector.<>c__displayClass6_0.<Select>b__0(IProperty p,IEntityType e)
   at Microsoft.EntityFrameworkCore.ValueGeneration.ValueGeneratorCache.<>c.<GetorAdd>b__3_0(CacheKey ck)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetorAdd(TKey key,Func`2 valueFactory)
   at Microsoft.EntityFrameworkCore.ValueGeneration.ValueGeneratorCache.GetorAdd(IProperty property,IEntityType entityType,Func`3 factory)
   at Microsoft.EntityFrameworkCore.ValueGeneration.ValueGeneratorSelector.Select(IProperty property,IEntityType entityType)
   at Microsoft.EntityFrameworkCore.ValueGeneration.Internal.sqlServerValueGeneratorSelector.Select(IProperty property,IEntityType entityType)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.ValueGenerationManager.Generate(InternalEntityEntry entry)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetEntityState(EntityState entityState,Boolean acceptChanges,Boolean forceStateWhenUnkNownKey)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.PaintAction(EntityEntryGraphNode node)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph(EntityEntryGraphNode node,Func`2 handleNode)
   at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.AttachGraph(InternalEntityEntry rootEntry,EntityState entityState,Boolean forceStateWhenUnkNownKey)
   at Microsoft.EntityFrameworkCore.DbContext.SetEntityState(InternalEntityEntry entry,EntityState entityState)
   at Microsoft.EntityFrameworkCore.DbContext.SetEntityState[TEntity](TEntity entity,EntityState entityState)
   at Microsoft.EntityFrameworkCore.DbContext.Add[TEntity](TEntity entity)
   at DAL.Tests.UnitTest1.TestMethod1() in C:\Users\jkruer\Source\Repos\JLM.App.ChromeIncentivesService\DAL.Tests\UnitTest1.cs:line 12

我创建了一个非常简化的版本,并能够使用我的单个表,单个实体,单个记录,单个单元测试实现来重现问题.

我的数据库表:

CREATE TABLE [dbo].[ChromeMileageRestrictionTEST](
    [TermID] [varchar](50) NOT NULL,[Mileage] [varchar](50) NOT NULL,[Residual] [decimal](18,8) NOT NULL,[isDefault] [bit] NOT NULL,CONSTRAINT [PK_ChromeMileageRestrictionTEST] PRIMARY KEY CLUSTERED 
(
    [TermID] ASC,[Mileage] ASC,[Residual] ASC,[isDefault] ASC
)WITH (PAD_INDEX = OFF,STATISTICS_norECOmpuTE = OFF,IGnorE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[ChromeMileageRestrictionTEST] ADD  CONSTRAINT [DF_ChromeMileageRestrictionTEST_Residual]  DEFAULT ((0)) FOR [Residual]
GO

ALTER TABLE [dbo].[ChromeMileageRestrictionTEST] ADD  CONSTRAINT [DF_ChromeMileageRestrictionTEST_isDefault]  DEFAULT ((0)) FOR [isDefault]
GO

我的dbContext:

public partial class ReportingContext : DbContext
    {
        public ReportingContext()
        {
        }

        public virtual DbSet<ChromeMileageRestrictionTest> ChromeMileageRestriction { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UsesqlServer(@"MyConnectionStringGoesHere");            
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ChromeMileageRestrictionTest>(entity =>
            {
                entity.HasKey(e => new { e.TermId,e.Mileage,e.Residual,e.IsDefault })                
                .HasName("PK_ChromeMileageRestrictionTest");

                entity.Property(e => e.TermId)
                    .HasColumnName("TermID")
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.Property(e => e.Mileage)
                    .HasMaxLength(50)
                    .IsUnicode(false);

                entity.Property(e => e.Residual)
                    .HasColumnType("decimal(18,8)")
                    .HasDefaultValuesql("((0))");

                entity.Property(e => e.IsDefault)
                    .HasColumnName("isDefault")
                    .HasDefaultValuesql("((0))");
            });
        }
    }

我的实体:

public partial class ChromeMileageRestrictionTest
    {
        public string TermId { get; set; }
        public string Mileage { get; set; }
        public decimal Residual { get; set; }
        public bool IsDefault { get; set; }
    }

我的单元测试:

[TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var dbContext = new ReportingContext();
            dbContext.Add(new ChromeMileageRestrictionTest 
            {
                TermId = "6078915-0-0",Mileage = "15,000",Residual = 45.00000000M,IsDefault = true //THIS WORKS
            });
            dbContext.Add(new ChromeMileageRestrictionTest 
            {
                TermId = "6078915-0-0",IsDefault = false //THIS THROWS AN EXCEPTION
            });
            dbContext.SaveChanges();
        }
    }

我一直在这个问题上摸不着头脑.我无法弄清楚.任何帮助将不胜感激!

谢谢!

解决方法

重复: Entity Framework not including columns with default value in insert into query

TLDR:我从数据库和DbContext映射中删除了IsDefault字段的认值False.这解决了这个问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐