EF 4.1 Сохранение записи создает запись для таблицы поиска - PullRequest
0 голосов
/ 07 июля 2011

Вот мои занятия

public class Activity
{
    public int ID {get;set;}
    public string Personnel { get; set; }
    public Location Location { get; set; }
}

public class Location
{
    [Key]
    public string Name { get; set; }
}

Когда я сохраняю активность, она создает новое местоположение, даже если оно уже существует. Как мне настроить его так, чтобы он использовал существующие локации?

Ответы [ 3 ]

1 голос
/ 07 июля 2011

Загрузите существующий Location через контекст и используйте его в качестве значения свойства Activity

, например:

using(var context = new MyDbContext())
{
   var location = context.Locations.FindByKey(/* set key*/);
   var activity = new Activity(){Personnel = "Foo", Location = location};
   context.Activities.Add(activity);
   context.SaveChanges();
}
0 голосов
/ 07 июля 2011

Другим способом является присоединение местоположения к контексту перед добавлением действия:

using(var context = new MyDbContext())
{
    var location = new Location { Name = "MyName" };
    context.Locations.Attach(location);

    var activity = new Activity { Personnel = "Foo", Location = location };
    context.Activities.Add(activity);
    context.SaveChanges();
}

Это спасает вас от извлечения местоположения из БД.

Другой вариант (который требуетизменить модель, хотя), чтобы выставить внешний ключ для местоположения классу Activity:

public class Activity
{
    public int ID {get;set;}
    public string Personnel { get; set; }
    [ForeignKey("Location")]
    public string LocationName { get; set; }
    public Location Location { get; set; }
}

Тогда вы можете просто присвоить значение FK:

using(var context = new MyDbContext())
{
    var activity = new Activity { Personnel = "Foo", LocationName = "MyName" };
    context.Activities.Add(activity);
    context.SaveChanges();
}

Оставить Locationсвойство навигации null в этом случае.

0 голосов
/ 07 июля 2011

Добавьте атрибут Key в Activity.ID, так же, как вы используете для Location.Name

public class Activity
{
    [Key]
    public int ID {get;set;}
    public string Personnel { get; set; }
    public Location Location { get; set; }
}
...