繁体   English   中英

实体框架1-to- *和1-to-1

[英]Entity Framework 1-To-* and 1-to-1

(实体框架6,.NET 4和VS 2010)

我创建了一个小型Blog项目来说明问题。 这是一个博客,其中包含许多帖子,但只有其中一个帖子充当主要帖子。

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'."}得到{"Invalid column name 'Blog_Id'."}

如果将属性从[ForeignKey("MainPostId")]更改为[ForeignKey("Id")] {"Invalid column name 'Blog_Id'."}收到以下错误{"Invalid column name 'Blog_Id'."}

我究竟做错了什么? 如何启用从博客到主要帖子的导航属性?

您遇到的问题是,您正在同一两个表之间创建两个关系,而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);

暂无
暂无

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

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