实体框架一对多

时间:2015-03-30 16:09:22

标签: c# entity-framework entity-framework-6

首先,我将这两个模型存储在两个表中,一个用于共享数据,另一个包含用于英语和阿拉伯语的文化数据

public class Post
{
    public int Id { set; get; }
    public bool Active { get; set; }
    public bool Featured { get; set; }
    public virtual ICollection<PostContent> Contents { get; set; }
}

public class PostContent
{
    public int Id { set; get; }
    public string Title { get; set; }
    public string Summary { get; set; }
    public string Details { get; set; }

    [StringLength(2)]
    public string Culture { get; set; }

    public int PostId { get; set; }

    [InverseProperty("PostId")]
    public virtual Post Post{ set; get; }
}

映射

public class PostMap : EntityTypeConfiguration<Post>
{
    public PostMap()
    {
        HasKey(p => p.Id);
        Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        ToTable("Posts");
    }
}

public class PostContentMap : EntityTypeConfiguration<PostContent>
{
    public PostContentMap()
    {
        HasKey(p => p.Id);
        Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        HasRequired(p => p.Post).WithMany(p => p.Contents).HasForeignKey(p=>p.PostId);
        ToTable("PostContents");
    }
}

我有两个问题

1-这些型号是否正确连接。还有什么我需要做的吗?

2-我需要选择所有帖子及其内容的文化内容&#39; en&#39;例如。我用过这个:

var res = context.Posts.Include(p => p.Contents.Single(c => c.Culture.Equals("en")));

并出现此错误:

  

Include路径表达式必须引用在类型上定义的导航属性。使用虚线路径作为参考导航属性,使用Select运算符作为集合导航属性。参数名称:路径

1 个答案:

答案 0 :(得分:1)

如果您知道自己 支持两种以上的文化,那么我只会添加到您的Post类。

 public class Post
 {

    public Post()
    {
        Contents = new List<PostContent>();
    }
    public int Id { set; get; }
    public bool Active { get; set; }
    public bool Featured { get; set; }
    public int? EnglishContentId { get;set;}
    public int? ArabicContentId { get;set;}

    PostContent EnglishContent {get;set;}
    PostContent ArabicContent {get;set;}

 }

public class PostContent
{
    public int Id { set; get; }
    public string Title { get; set; }
    public string Summary { get; set; }
    public string Details { get; set; }

    [StringLength(2)]
    public string Culture { get; set; }/*This property is not required*/

}

    public class PostMap : EntityTypeConfiguration<Post>
{
    public PostMap()
    {
        HasKey(p => p.Id);
        Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        ToTable("Posts");
        HasOptional(p => p.EnglishContent).WithMany().HasForeignKey(p=>p.EnglishContentId);
        HasOptional(p => p.ArabicContent).WithMany().HasForeignKey(p=>p.ArabicContentId);
    }
}

public class PostContentMap : EntityTypeConfiguration<PostContent>
{
    public PostContentMap()
    {
        HasKey(p => p.Id);
        Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        ToTable("PostContents");
    }
}

以上设计将简化您的设计和查询,将提高性能。

但是如果你可能需要支持更多的文化,那么你就可以获得正确的设计和映射。

就EF 5而言,include不允许使用过滤器,但我不确定EF 6.0 至少你可以得到所有英文内容如下的帖子

添加using System.Data.Entity;

var res = context.Posts.Include(p => p.Contents).Where(c => c.Contents.Any(cp=>cp.Culture.Equals("en")));