Имя свойства в типе должно быть уникальным

Я использую Entity Framework 5, и у меня есть следующие объекты:

public class User {
  public Int32 Id { get; set; }
  public String Username { get; set; }    
  public virtual ICollection<CLaim> CLaims { get; set; }
}

public class Claim {
  public Int32 Id { get; set; }
  public String Type { get; set; }
  public String Value { get; set; }
  public virtual User User { get; set; }
}

Несколько примечаний об этих объектах:

  • В пользовательском объекте Id является PK;
  • В объекте претензии Id является FK и равен User.Id;
  • В объекте претензии PK является составным из (Id, Type, Value)

Итак, у меня есть следующий SQL для этих объектов:

create table dbo.Users
(
  Id int identity not null 
    constraint PK_Users_Id primary key clustered (Id),  
  Username nvarchar (120) not null
    constraint UQ_Users_Username unique (Username)
);

create table dbo.Claims
(
  Id int not null,
  [Type] nvarchar (200) not null,
  Value nvarchar (200) not null,
    constraint PK_Claims_Id_Type_Value primary key (Id, [Type], Value),
);

alter table dbo.Claims
add constraint FK_CLaims_Id foreign key (Id) 
    references dbo.Users(Id) on delete cascade on update cascade;

Наконец, конфигурация объектов выглядит следующим образом:

internal class UserConfiguration : EntityTypeConfiguration<User> {
  internal UserConfiguration() : base() {
    ToTable("Users");
    HasKey(x => x.Id);
    Property(x => x.Id).IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    Property(x => x.Username).IsRequired().HasMaxLength(120);
  }
}

internal class ClaimConfiguration : EntityTypeConfiguration<Claim> {
  internal ClaimMapper() : base() {
    ToTable("Claims");
    HasKey(x => new { x.Id, x.Type, x.Value });
    Property(x => x.Id).IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    Property(x => x.Type).IsRequired().HasMaxLength(200);
    Property(x => x.Value).IsRequired().HasMaxLength(200);

    HasRequired<User>(x => x.User).WithMany(y => y.Claims).Map(z => { z.MapKey("Id"); });
  }
}

ПРОБЛЕМА:

Когда я пытаюсь создать пользователя, я получаю следующую ошибку:

Каждое имя свойства в типе должно быть уникальным. Идентификатор свойства 'Id' уже определен.

Кто-нибудь знает, что я могу делать неправильно?

Ответ 1

MapKey используется, только если ваш столбец внешнего ключа не отображается как свойство в вашей модели. Но в вашем случае это - как свойство Claim.Id. В этом случае вы должны использовать HasForeignKey вместо MapKey:

HasRequired<User>(x => x.User)
    .WithMany(y => y.Claims)
    .HasForeignKey(x => x.Id);

Ответ 2

В дополнение к ответу Slauma

HasForeignKey недоступен для 1:1, если вам все еще нужно, вы можете просто использовать WithMany без параметров

HasRequired<User>(x => x.User).WithMany().HasForeignKey(x => x.Id);
HasRequired(x => x.City).WithMany().HasForeignKey(x => x.CityId);