Произошла ошибка при сохранении сущностей, которые не предоставляют свойства внешнего ключа для своих отношений - PullRequest
47 голосов
/ 29 октября 2011

У меня есть простой код в Entity Framework 4.1 код:

PasmISOContext db = new PasmISOContext();
var user = new User();
user.CreationDate = DateTime.Now;
user.LastActivityDate = DateTime.Now;
user.LastLoginDate = DateTime.Now;
db.Users.Add(user);

db.SaveChanges();
user.Avatar = new Avatar() { Link = new Uri("http://myUrl/%2E%2E/%2E%2E") };
db.SaveChanges();


db.Users.Add(new User() { Avatar = new Avatar() { Link = new Uri("http://myUrl/%2E%2E/%2E%2E") } });
db.SaveChanges();

Проблема в том, что я получаю ошибку

Произошла ошибка при сохранении объектов, которые невыставить свойства внешнего ключа для их отношений.Свойство EntityEntries вернет значение NULL, поскольку один объект не может быть определен как источник исключения.Обработка исключений при сохранении может быть упрощена путем предоставления свойств внешнего ключа в типах объектов.Подробности смотрите в InnerException.

на

db.Users.Add(new User() { Avatar = new Avatar() { Link = new Uri("http://myUrl/%2E%2E/%2E%2E") } });
db.SaveChanges();

Я не понимаю, почему работает подобная операция.Что-то не так с моей моделью или с ef-code-first?

public class Avatar
{
    [Key]
    public int Id { get; set; }

    [Required]
    public string LinkInString { get; set; }

    [NotMapped]
    public Uri Link
    {
        get { return new Uri(LinkInString); }
        set { LinkInString = value.AbsoluteUri; }
    }
}

public class User
{
    [Key]
    public int Id { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public Avatar Avatar { get; set; }
    public virtual ICollection<Question> Questions { get; set; }
    public virtual ICollection<Achievement> Achievements { get; set; }

    public DateTime CreationDate { get; set; }
    public DateTime LastLoginDate { get; set; }
    public DateTime LastActivityDate { get; set; }
}

Ответы [ 14 ]

0 голосов
/ 26 мая 2015

В моем случае проблема заключалась в том, что я неправильно переименовал столбец, поэтому при миграции было создано два столбца, один с именем «TeamId», а другой с «TeamID».C # заботится, SQL нет.

0 голосов
/ 11 марта 2015

У меня такая же проблема. в моем случае это было связано с полем datetime с нулевым значением. Я должен был передать значение datetime, и все прошло хорошо

0 голосов
/ 31 января 2015

У меня была та же ошибка, и в моем случае проблема заключалась в том, что я добавил объект отношения, который уже был загружен "AsNoTracking". Мне пришлось перезагрузить свойство отношения.

Кстати, некоторые предлагают использовать "Attach" для отношений, которые уже существуют в БД, хотя я не пробовал эту опцию.

0 голосов
/ 05 ноября 2014

Другой ответ:

Я использовал это:

public List<EdiSegment> EdiSegments { get; set; }

вместо этого:

public virtual ICollection<EdiSegment> EdiSegments { get; set; }

и получил сообщение об ошибке, указанное выше.

...