ef代码首先将id增加1

时间:2014-08-20 08:32:13

标签: entity-framework ef-code-first

我使用EF来更新我的数据库。

这是我的模特:

    //Resource
    public long ResourceId { get; set; }
    public string Name { get; set; }
    public string Descritption { get; set; }
    public string UserId { get; set; }
    public int ResourceTypeId { get; set; }
    public byte[] Data { get; set; }
    public bool IsEnabled { get; set; }
    public bool Approved { get; set; }
    public System.DateTime DateCreated { get; set; }
    public virtual ICollection<MetaData> MetaDatas { get; set; }


    //MetaData
    public long MetaDataId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string LanguageCode { get; set; }
    public string UserId { get; set; }
    public System.DateTime DateCreated { get; set; }
    public virtual ICollection<ResourceMetaList> ResourceMetaLists { get; set; }
    public virtual ICollection<Resource> Resources { get; set; }

每次添加新元数据时,元数据增加1的原因是什么? 我希望能够添加具有特定ID的元数据吗?

资源和元数据之间存在连接,其中每个连接都与它们连接。所以我希望能够为每个资源添加一个特定的元数据,但是现在它每次都给它一个新的id,因此它不是每次都连接到每个资源但每次都是新的资源的相同元数据。

修改

也许问题不在于我如何建模我的数据库,而是如何用数据更新数据库? 在Resource和MetaData之间有一个连接表,我希望更新该表而不是元数据表本身。但是连接表没有自己的模型类,但我存在于数据库中。我该如何仅更新该表?

编辑2 enter image description here

3箭头指向看起来相同的行,它们应该都是同一行,但是要连接到左边表格中的不同资源。

4 个答案:

答案 0 :(得分:0)

您需要切换默认的身份映射
Ef Fluent API mappings

或使用注释

[DatabaseGenerated(DatabaseGenerationOption.None)]   
int id {get;set;}

EF annotations

答案 1 :(得分:0)

您可以在EF中定义和使用多对多关系,无论您是use a model还是Code First都无关紧要。

如果你谷歌“EF多对多关系”,有很多信息。

如果您使用此EF关系,您可以让EF生成ID,它将为您执行关系修复,并自动管理关系表。

答案 2 :(得分:0)

要添加/删除关系,您可以使用ChangeRelationshipState

例如,如果要在元数据10,12,19和资源3之间添加关系。

你可以这样做。

using (var db = new AppContext())
{
    var r3 = new Resource { ResourceId = 3 };
    var m10 = new Metadata { MetadataId = 10 };
    var m12 = new Metadata { MetadataId = 12 };
    var m19 = new Metadata { MetadataId = 19 };

    db.Entry(r3).State = EntityState.Unchanged;
    db.Entry(m10).State = EntityState.Unchanged;
    db.Entry(m12).State = EntityState.Unchanged;
    db.Entry(m19).State = EntityState.Unchanged;

    var manager = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager;
    manager.ChangeRelationshipState(r3, m10, h => h.Metadatas, EntityState.Added);
    manager.ChangeRelationshipState(r3, m12, h => h.Metadatas, EntityState.Added);
    manager.ChangeRelationshipState(r3, m19, h => h.Metadatas, EntityState.Added);
    db.SaveChanges();
}

答案 3 :(得分:-1)

添加关键属性

[Key]
public long MetaDataId { get; set; }