在c#类中实现导航属性

时间:2011-10-06 20:32:53

标签: c# entity-framework navigation-properties

我有2个实体,每个实体都有一个相关的c#类。我在表格A 上设置了导航属性,以包含对表格B 中许多项目的引用。当我创建一个新的表一个类对象时,我需要能够在表A 中创建表B 对象的集合。如何在表A c#类中设置导航属性?

数据模型: http://bluewolftech.com/mike/mike/datamodel.jpg

1 个答案:

答案 0 :(得分:1)

EF中的导航属性很简单。下面的示例显示了导航属性的外观:

public class Foo
{
    public int FooId { get; set; }
    public string SomeProperty { get; set; }

    public virtual IEnumerable<Bar> Bars { get; set; }
}

其中Foo代表tableA,Bar代表tableB。它们的关键字是导航属性是虚拟的,默认情况下启用延迟加载。假设您使用的是EF4.1 Code First。

修改

在我的头顶,这应该是一个很好的起始模板:

public class PointOfInterestContext : DbContext
{
    public IDbSet<PointOfInterest> PointOfInterest { get; set; }
    public IDbSet<POITag> POITag { get; set; }
    public IDbSet<Tag> Tag { get; set; }

    public override OnModelCreating(DbModelBuilder modelBuilder)
    {
        // custom mappings go here
        base.OnModelCreating(modelBuilder)
    }
}

public class PointOfInterest
{
    // properties
    public int Id { get; set; }
    public string Title { get; set; }
    // etc...

    // navigation properties
    public virtual IEnumerable<POITag> POITags { get; set; }    
}

public class POITag
{
    // properties
    public int Id { get; set;}
    public int PointOfInterestId { get; set; }
    public int TagId { get; set; }

    // navigation properties
    public virtual PointOfInterest PointOfInterest { get; set; }
    public virtual Tag Tag { get; set; }
}

public class Tag
{
    // properties
    public int Id { get; set; }
    public string TagName { get; set; }
    // etc...

    // navigation properties
    public virtual IEnumerable<POITags> POITags { get; set; }    
}

然后,您将在业务对象中实现其他逻辑。实体应该是轻量级的,并且最多应该具有数据属性。我更喜欢通过OnModelCreating使用流畅的映射。

以下是一些很好的参考文献:
MSDN - EF 4.1 Code First
Code First Tutorial