2017-01-06 36 views
0

当调用上下文的Attach方法将对象附加到上下文时,负序列号应暂时分配给Identity属性。在我的情况下,该值似乎是永久性的,最终将对象保存到数据库时会导致错误。EF Core将负序号分配给自动增量int字段

public virtual void Insert(TEntity entity) 
    { 
     entity.ObjectState = ObjectState.Added; 
     _dbSet.Attach(entity); 
     _context.SyncObjectState<TEntity>(entity); 
    } 

public class Tier:Entity 
{ 
    public Tier() 
    { 

    } 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int TierID { get; set; } 
    public string CountryID { get; set; } 
    public string TierName { get; set; } 
    public int TierNo { get; set; } 

    public virtual ICollection<AdministrativeStructure> AdministrativeStructures { get; set; } 

    public Country Country { get; set; } 
} 

我使用的EntityFramework核心1.1.0与MSSQL服务器2016

+0

是什么类型的 '一线'? –

+1

请阅读[问]并提供[mcve]。 – CodeCaster

+0

定义“随机” - 每次都是相同的“随机”数字,还是每个“层次”实例的不同数字? – soupdog

回答

1

让我们来看看。如果创建这样的属性的类,并且不会给它任何输入,整数将有以下值:

0

代码:

class Program 
{ 
    static void Main(string[] args) 
    { 
     tmpClass testClass = new tmpClass(); 
     Debug.WriteLine(testClass.IntTest); 


    } 

    public class tmpClass 
    { 
     public int IntTest { get; set; } 
    } 
} 

正如你可以看到我没”不要操纵任何东西。值为零,0,来自Int的默认值。你说你使用TierID作为主键值。你的桌子是否知道如何处理这个问题,比如它会给它一个ID还是你需要给它一个ID?也许那是错误发生的地方。错误的主键。

在你的情况下,似乎数据库一代似乎没有正确工作。

MSDN Documentation

尝试:

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public int TierId { get; set; } 
+0

我没有提供任何ID。数据库这样做。但我想我已经能够发现问题的来源。我用了一个存储库模式框架(URF),做了一些细微的修改,因此它可以与DOTNET的核心工作,并在此行是什么,是创造该问题的“公共虚拟无效SyncObjectState (TEntity实体),其中TEntity:类,IObjectState { 条目(实体).State = StateHelper.ConvertState(实体。ObjectState); “ }” –

+0

在这条线上发生了一些似乎只影响“TierID”的内容,将它改为负数,我没有丝毫的想法发生了什么,如果这样可以帮助您我在这里 –

+0

啊,是的,好的,谢谢你的答案,你看看@Tazbir Bhuiyan在几年前发现的解决方案。http://stackoverflow.com/questions/31333916/failed-to-save-data-using- ef6-error-originalvalues-can-the-used-for-entities – Cataklysim