Вставки внешнего ключа Entity Framework с Auto-Id - PullRequest
7 голосов
/ 28 октября 2011

У меня есть 2 сущности User и User_Profile (отношение один к одному). Я связал их следующим образом:

public class User
{
   [Key]   
   [ForeignKey("user_profile")]
   public int user_id {get;set;}

   public string username {get;set;}
   public string email {get;set;}

   public virtual User_Proile user_profile {get;set;}
}


public class User_Profile
{
   [Key]   
   public int user_id {get;set;}

   public string firstname {get;set;}
   public string lastname {get;set;}
}

user_id - это PK в таблицах User и User_Profile SQL Server. Он также устанавливается как столбец Identity в таблице User.

Когда я пытаюсь вставить новую запись через EFDBContext Add / SaveChanges. Я получаю следующую ошибку: «user_id не может быть NULL в таблице User_Profile». Это имеет смысл, так как это столбец PK. Я надеялся, что EF сможет взять Identity user_id у пользователей и вставить его в User_Profile user_id при сохранении.

Возможно ли это, и если да, то как бы я это реализовал?

ОБНОВЛЕНИЕ: Обратите внимание, что я вручную создал таблицы DB и классы кода, поэтому у меня нет доступа к StoreGeneratedPattern через файл .edmx.

Ответы [ 2 ]

7 голосов
/ 29 октября 2011

Я думаю, что необходимо точно настроить отношения один к одному, используя Fluent API:

public class MyContext : DbContext
{
    // ... your DbSets

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasRequired(u => u.user_profile)
            .WithRequiredPrincipal();
    }
}

А классы сущностей:

public class User
{
    [Key]   
    public int user_id {get;set;}
    public string username {get;set;}
    public string email {get;set;}
    public virtual User_Profile user_profile {get;set;}
}

public class User_Profile
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int user_id {get;set;}
    public string firstname {get;set;}
    public string lastname {get;set;}
}

Необходимо отключитьDatabaseGeneratedOption от Identity до None в одном из классов.Я поменял принципала и зависимого, так как кажется, что User должен быть принципалом.[ForeignKey(...)] не является необходимым, потому что EF распознает user_id в User_Profile как свойство FK для User.

Код, подобный этому ...

using (var context = new MyContext())
{
    var user = new User();
    var userProfile = new User_Profile();

    user.user_profile = userProfile;

    context.Users.Add(user);
    context.SaveChanges();
}

.... должен работать тогда, как вы ожидаете, и сохранять оба связанных объекта в базе данных.

0 голосов
/ 29 октября 2011

Необходимо установить для атрибута StoreGeneratedPattern значение Identity в вашем файле .edmx, чтобы инфраструктура знала, что поле генерируется базой данных. Эта ссылка может помочь ...

Автономер с Entity Framework

...