Entity framework ef代码首次将id增加1

Entity framework ef代码首次将id增加1,entity-framework,ef-code-first,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; } pu

我正在使用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; }
//资源
公共长资源ID{get;set;}
公共字符串名称{get;set;}
公共字符串描述{get;set;}
公共字符串用户标识{get;set;}
public int ResourceTypeId{get;set;}
公共字节[]数据{get;set;}
公共布尔值已启用{get;set;}
公共布尔批准{get;set;}
public System.DateTime DateCreated{get;set;}
公共虚拟ICollection元数据{get;set;}
//元数据
公共长元数据ID{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共字符串语言代码{get;set;}
公共字符串用户标识{get;set;}
public System.DateTime DateCreated{get;set;}
公共虚拟ICollection ResourceMetaLists{get;set;}
公共虚拟ICollection资源{get;set;}
是什么使metadataid在每次添加新元数据时增加1? 我希望能够添加具有特定id的元数据

资源和元数据之间有一个ConnectionTable,其中每个资源和元数据的id都将它们连接起来。因此,我希望能够为每个资源添加一个特定的元数据,但现在它每次都给它一个新的id,因此连接到每个资源的元数据并不完全相同,而是每次都有一个新的元数据

编辑

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

编辑2

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

添加键属性

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

您需要切换默认标识映射的设置

或者使用注释

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

您可以在EF中定义和使用多对多关系,无论您是,还是

如果你在谷歌上搜索“EF多对多关系”,这方面的信息会很多


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

要添加/删除关系,您可以使用
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();
}

无法解析databasegenerationoptin,我需要什么引用?命名空间:System.ComponentModel.DataAnnotations.Schema程序集:System.ComponentModel.DataAnnotations(在System.ComponentModel.DataAnnotations.dll中)的可能重复项