繁体   English   中英

EF5逆属性问题

[英]EF5 InverseProperty Issue

我正在尝试将以下模型(参见下图)转换为Code First。 我尝试了各种涉及ForeignKey和InverseProperty属性的组合,但是没有运气。 我找到了这个答案,但似乎ForeignKey和InverseProperty的组合会导致不同的行为。

随附的源代码给出以下错误:

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

这是我的EDMX模型

型号范例

样例代码:

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:1关联的两端使用[InverseProperty]时,不清楚主体应该是谁。 原理是另一端(从属)通过外键引用的实体。 即使你告诉EF这EditoredByCurrentlyWorkingBookId都是一个协会的一部分,它仍然是有可能有一个外键字段EditoredByBook (将不可能在班级模型显示)。

诚然,您可以说您已经告诉EF足够正确地创建数据库模型。 EF可能有这样的逻辑:如果有人告诉我1:1关联中有一个外键,那么我知道应该是谁。 但是,不幸的是事实并非如此。

因此,我将使用流畅的API对此进行建模:

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; }
}

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"));

就我个人而言,我喜欢流利的API,因为lambda表达式允许进行编译时检查,而且末端组成一个关联的情况更加明显。

如您所见,在这种情况下, CurrentlyWorkingBookId不能成为类模型的一部分。 这是因为OptionalNavigationPropertyConfigurationWithOptionalDependent的返回类型)没有HasForeignKey方法。 我不确定为什么不这样做。 我认为应该可以设置原始FK值( CurrentlyWorkingBookId )以及引用属性( CurrentlyWorkingBook )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM