ASP.NET MVC Code first: множественность недопустима в роли в отношениях - PullRequest
3 голосов
/ 27 марта 2012

У меня простые отношения. Кампания связана с двумя страницами. Страница может быть связана только с одной кампанией. Но я продолжаю сталкиваться с этой ошибкой:

System.Data.Edm.EdmAssociationEnd:: кратность недопустима в роли «Page_Campaign_Source» в отношении «Page_Campaign». Поскольку Свойства зависимой роли - это не ключевые свойства, верхняя граница кратности зависимой роли должно быть '*'.

Я просмотрел несколько примеров кодов и учебных пособий, сравнивая их с моим кодом, но не могу найти ошибку.

 public class Campaign
    {
        [Key()]
        public int Campaignid { get; set; }
        public string Name { get; set; }

        public virtual Page LandingPage { get; set; }
        public virtual RedeemPage RedeemPage { get; set; }
    }


public class Page
{
    [Key()]
    public int PageContentId { get; set; }
    public string Logo { get; set; }
    public string Css { get; set; }

    [ForeignKey("Campaign")]
    public int campaignID { get; set; }
    public virtual Campaign Campaign { get; set; }
}

Редактировать

Следовал ответу Eranga и использовал Fluent API, но теперь я получаю:

Произошла ошибка при сохранении сущностей, которые не предоставляют внешний ключ свойства для их отношений

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

В этом сценарии отображение аннотаций данных сбивает с толку.Используйте Fluent API для настройки.Удалите аннотации данных для сопоставления навигационных свойств и используйте свободный API следующим образом.

class MyContext : DbContext
{

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Campaign>().HasRequired(x => x.LandingPage)
           .WithMany();

        modelBuilder.Entity<Page>().HasRequired(x => x.Campaign)
           .WithMany()
           .HasForeignKey(x => x.campaignID); 

      base.OnModelCreating(modelBuilder);
    }
}

Редактировать

Проблема после установки WillCascadeOnDelete(false) заключается в том, что оба Campaignи Page имеет автоматически увеличивающиеся PK, и у вас есть сопоставление 1 к 1.Следовательно, чтобы сохранить одну запись, ей нужен идентификатор другой вставленной строки, а другой строке нужен идентификатор 1-й строки.

Вы можете либо изменить PK на GUID, либо сделать 1 FK обнуляемым ипозвоните SaveChanges дважды.Например,

Изменение отношения к nullable

    modelBuilder.Entity<Campaign>().HasOptional(x => x.LandingPage)
       .WithMany();


using(var scope = new TransactionScope())
{

       context.Campaigns.Add(campaign);
       context.SaveChanges();

       page.CampaignId = campaign.CampaignId;
       context.Pagess.Add(page);
       context.SaveChanges();

       scope.Complete();
}
0 голосов
/ 27 марта 2012

Я думаю, у вас должна быть коллекция страниц в вашей кампании, а не 2 дочерних объекта,

уже давно с тех пор, как я последний раз кодировал в MVC, но если я правильно помню, это должно бытьчто-то вроде:

public virtual Collection<Page> pages

, в который вы затем помещаете свои 2 страницы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...