2015-05-29 2 views
6

(Entity Framework 6, .NET 4, VS 2010)Entity Framework 1-To * и 1-на-1

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

public class Blog 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Post> PostEntities { get; set; } 

    public int? MainPostId { get; set; } 

    [ForeignKey("MainPostId")] 
    public virtual Post MainPostEntity { get; set; } // Problem here 
} 

public class Post 
{ 
    public int Id { get; set; } 
    public int BlogId { get; set; } 
    [ForeignKey("BlogId")] 
    public virtual Blog BlogEntity { get; set; } 
    public string Title { get; set; } 
} 

modelBuilder.Entity<Blog>() 
    .HasOptional(b => b.MainPostEntity) 
    .WithRequired(p => p.BlogEntity); 

static void Main(string[] args) 
{ 
    Database.SetInitializer<EFTestContext>(null); 
    EFTestContext db = new EFTestContext(); 
    Post[] posts = db.Posts.ToArray(); // Error here 
} 

Если удалить свойство навигации public virtual Post MainPostEntity все работает, как ожидалось. Однако, когда я добавляю его, я получаю:

base {System.SystemException} = {"The ForeignKeyAttribute on property 'MainPostEntity' on type 'EFTest.Blog' is not valid. The foreign key name 'MainPostId' was not found on the dependent type 'EFTest.Post'. The Name value should be a comma separated list of foreign key property names."}

Если удалить беглый вызова API, я получаю {"Invalid column name 'Blog_Id'."}

Если изменить атрибут из [ForeignKey("MainPostId")] в [ForeignKey("Id")] я получаю следующее сообщение об ошибке {"Invalid column name 'Blog_Id'."}

Что я делаю неправильно? Как включить свойство навигации из блога в главную почту?

ответ

2

Проблема у Вас есть то, что вы создаете два соотношение между теми же самыми двумя таблицами и EF не может отличить, какие отношения собственности навигации BlogEntity является частью. Используя беглый api, вы можете прямо сказать об этом, аннотации данных тогда не нужны.

modelBuilder.Entity<Blog>().HasMany(b => b.PostEntities). 
          WithRequired(p => p.BlogEntity). 
          HasForeignKey(p => p.BlogId). 
          WillCascadeOnDelete(true); 

modelBuilder.Entity<Blog>().HasOptional(b => b.MainPostEntity). 
          WithMany(). 
          HasForeignKey(b => b.MainPostId). 
          WillCascadeOnDelete(false); 
+0

Спасибо, это сработало! – Adam

+0

Добро пожаловать, рад помочь. – user2697817