EF5 InverseProperty问题

时间:2013-10-31 08:32:17

标签: c# linq entity-framework linq-to-entities entity-framework-5

我试图将以下型号(见下图)转换为Code First。我尝试过涉及ForeignKey和InverseProperty属性的各种组合,没有运气。我发现了这个answer,但似乎ForeignKey和InverseProperty的组合会导致不同的行为。

附加的源代码会出现以下错误:

  

无法确定类型之间关联的主要结尾' InversePropertyTest.Author'和' InversePropertyTest.Book'。必须使用关系流畅API或数据注释显式配置此关联的主要结尾。

这是我使用EDMX的模型

Model example

示例代码:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace InversePropertyTest
{
    public class Author
    {
        public int AuthorId { get; set; }
        public Nullable<int> CurrentlyWorkingBookId { get; set; }

        [InverseProperty("Author")] public ICollection<Book> Books { get; set; }
        [ForeignKey("CurrentlyWorkingBookId"), InverseProperty("EditoredBy")] public Book CurrentlyWorkingBook { get; set; }
    }

    public class Book
    {
        public int BookId { get; set; }
        public int AuthorId { get; set; }

        [ForeignKey("AuthorId"), InverseProperty("Books")] public Author Author { get; set; }
        [InverseProperty("CurrentlyWorkingBook")] public Author EditoredBy { get; set; }
    }

    public class SimpleContext : DbContext
    {
        public DbSet<Author> Authors { get; set; }
        public DbSet<Book> Books { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new SimpleContext())
            {
                IList<Author> authors = (from a in context.Authors select a).ToList();
                IList<Book> books = (from b in context.Books select b).ToList();
            }
        }
    }
}

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

当您在1:1关联的两端使用[InverseProperty]时,不清楚校长应该是谁。原则是另一端(从属)通过外键引用的实体。即使您告诉EF EditoredByCurrentlyWorkingBookId都是一个关联的一部分,但仍然可以在EditoredBy Book中设置public class Author { public int AuthorId { get; set; } public ICollection<Book> Books { get; set; } public Book CurrentlyWorkingBook { get; set; } } public class Book { public int BookId { get; set; } public int AuthorId { get; set; } public Author Author { get; set; } public Author EditoredBy { get; set; } } 的外键字段(这不会' t在班级模型中表示。)

不可否认,人们可以说你已经告诉EF足以正确创建数据库模型。 EF可能有逻辑说:如果我被告知1:1关联中的一个外键,那么我知道原则应该是谁。然而,遗憾的是它没有。

所以我会使用流畅的API对此进行建模:

OnModelCreating

modelBuilder.Entity<Author>() .HasMany(a => a.Books) .WithRequired(b => b.Author) .HasForeignKey(b => b.AuthorId); modelBuilder.Entity<Author>() .HasOptional(a => a.CurrentlyWorkingBook) .WithOptionalDependent(b => b.EditoredBy) .Map(m => m.MapKey("CurrentlyWorkingBookId"));

CurrentlyWorkingBookId

就个人而言,我喜欢流畅的API,因为lambda表达式允许编译时检查,它更加显着,最终包含一个关联。

如您所见,OptionalNavigationPropertyConfiguration在此方案中不能成为类模型的一部分。这是因为WithOptionalDependentHasForeignKey的返回类型)没有CurrentlyWorkingBookId方法。我不知道为什么不呢。我认为应该可以设置原始FK值(CurrentlyWorkingBook)以及引用属性({{1}})。