The item with identity 'Id' already exists

2019-04-28 10:58发布

问题:

All of my entities have a base class:

public class Entity<TKey> : IEntity<TKey>
{
    dynamic IEntity.Id
    {
        get
        {
            return this.Id;
        }
        set
        {
            this.Id = value;
        }
    }

    public TKey Id { get; set; }
}

For example Status entity:

[MetadataType(typeof(StatusMetadata))]
public partial class Status : Entity<byte>
{
       public string Title { get; set; }
}

When I run the query against the database I get the following error: "The item with identity 'Id' already exists in the metadata collection. Parameter name: item". Is there any way to fix this or it's an issue caused by inheritance and I can't inherit my entities from any class?

回答1:

It seems a generic error, searching for some insights, I saw that:

Two tables can have the same name for a primary key. Look at the LightSwitch tables, they all have a primary key called Id.

At http://social.msdn.microsoft.com/Forums/vstudio/en-US/bd8d47da-d1b4-4be8-a7e5-193fb5360060/the-item-with-identity-actionpk-already-exists-in-the-metadata-collection?forum=lightswitch

So, I review all entities and I get an entity with a Identiy data type changed and a inherit another class it has int Id property.

Do I change this public new string Id { get; set; } to public string Id { get; set; } like others and remove the inherit and everything works fine.



回答2:

The reason is because you inherit from a class that already has an Id property of a different type.

I have seen the same error in CodeMigrations. I had a property named "Version" of type string, and the EntityData data class where I was inheriting from also containes a Version property of type byte[]. This generated the same error as you mentioned

The solution for this is just to don't use the same property names that are already in your base class.



回答3:

It happened to me because of a double field FK, that mistakenly I used the same field twice to link the tables...



回答4:

Try adding 'new' to the property like this:

[MetadataType(typeof(StatusMetadata))]
public partial class Status : Entity<byte>
{
       public new string Title { get; set; }
}