Я не могу получить 2 ссылки на один и тот же класс / таблицу - PullRequest
0 голосов
/ 07 марта 2012

У меня следующая проблема:

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

public class Chart
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public State Initial { get; set; }
    public virtual ICollection<State> States { get; set; }
}

и

public class State
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string Name { get; set; }
}

Я также хочу, чтобы свойство Initial класса Chart указывало на его начальное состояние.

Но что бы я ни пытался, я не получу его на работу. Я использовал аннотации данных, свободные API и свойства Foreignkey, но продолжаю сталкиваться с такими проблемами, как:

"Невозможно определить действительный порядок для зависимых операций. Зависимости могут существовать из-за ограничений внешнего ключа, требований модели или созданных в хранилище значений."

Чтобы сделать это еще более интересным, я бы хотел, чтобы начальное состояние было одним из состояний класса диаграммы.

Может кто-нибудь помочь мне?

UPDATE:

Я нашел кусок головоломки:

Фреймворк кода сначала пытается создать 2 таблицы.
Графики: с колонками -> Id, Initial_Id
Состояния: с колонками -> Id, Name, Chart_Id

Chart.Initial_Id ссылается на таблицу States и State.Chart_Id ссылается на таблицу Charts. Теперь это приводит к циклической проблеме при каскадном удалении или вставке и т. Д ...

Хммм ...

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

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

Однако,читая между строк, я сделаю предположение, что, возможно, объекты State должны быть разделены между несколькими объектами Chart.Другими словами, несколько графиков могут относиться к одному и тому же состоянию.В этом случае у вас действительно есть отношение «многие ко многим» между диаграммой и состоянием, и вы можете переопределить контекст OnModelCreating, чтобы сообщить EF следующее:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Chart>()
        .HasMany(s => s.States)
        .WithMany();
}

Теперь что-то подобное будет работать:

using (var context = new ChartContext())
{
    var state1 = new State { Name = "State1" };
    var state2 = new State { Name = "State2" };

    var chart =
        new Chart
        {
            Initial = state1,
            States = new List<State> { state1, state2 }
        };

    context.Charts.Add(chart);
    context.SaveChanges();
}

Как видите, диаграмма теперь имеет начальное состояние и набор состояний, а начальное состояние является одним из набора состояний.

Если фактически каждое состояние связано с одними только сущность Chart, тогда вам нужно будет найти что-то еще - возможно, есть обходные пути, чтобы сделать эту работу, но не так легко придумать, как решение выше.

0 голосов
/ 07 марта 2012

Это просто выстрел в темноте, но думаете ли вы, что это как-то связано с тем фактом, что свойства для обоих классов (предположительно, что вы хотите для своего первичного ключа) имеют guid, называемый id? Как насчет переименования в StateId и ChartId? Если ничего другого, я думаю, что это просто лучшая практика именования ...

Полное раскрытие: я не использую CF EF, но наткнулся на это как на интересный пост

...