0

我需要首先在实体框架代码中绑定一些关系,但我不知道如何。我深入搜索,尝试了很多方法,但仍然没有运气。我想我需要使用流畅的 API。

设想

组织有许多注释项目有很多注释Notes有一个OrganizationProject

这个想法是将每个实体(组织项目)绑定到Note实体中的一列: SourceKey

组织

public class Organization
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ID { get; set; }

    [Required(ErrorMessage = "A name is required.")]
    public string Name { get; set; }

    public virtual ICollection<Project> Projects { get; set; }
    public virtual ICollection<Note> Notes { get; set; }
}

项目

public class Project
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ID { get; set; }

    [Required(ErrorMessage = "An organization is required.")]
    [Display(Name = "Organization")]
    public Guid OrganizationID { get; set; }

    [Required(ErrorMessage = "A name is required.")]
    public string Name { get; set; }

    public virtual Organization Organization { get; set; }
    public virtual ICollection<Note> Notes { get; set; }
}

笔记

public class Note
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ID { get; set; }

    public Guid SourceKey { get; set; }

    [Required(ErrorMessage = "A title is required.")]
    public string Title { get; set; }

    [Column(TypeName = "ntext")]
    public string Value { get; set; }

    public string Tags { get; set; }
}

所以数据的一个例子可以是:

组织

7846ac27-d490-4483-8f0b-975a11333dea, Google

项目

3446ac27-d490-4323-8121-921a11333dac, Search
7846ac27-8497-5683-213b-933a11233abc, Maps

笔记

1236ac27-d490-4323-8121-921a11333dac, 7846ac27-d490-4483-8f0b-975a11333dea, A note for Google organization
2346ac27-d490-4323-8121-921a11335aab, 7846ac27-d490-4483-8f0b-975a11333dea, Another note for Google organization
3456ac27-d490-4323-8121-921a11331bcc, 7846ac27-8497-5683-213b-933a11233abc, Just a note for Maps project

顺便提一句

我不需要从 Notes(向上)导航到组织或项目。如果我有一个组织或项目,我需要导航(向下)到 Notes。

4

4 回答 4

1

如上所述,如果您不需要注释中的导航属性,则可以省略它们。

如果您随后在Note类中包含两个字段以用于外键关联:

public class Note
{
    // Code

    public Guid OrganizationId { get; set; }
    public Guid ProjectId { get; set; }
}

我认为大多数笔记不会同时属于Organisationa 和 a Project(尽管它们可以)。

您应该能够使用 fluent API 来配置映射,如下所示:

modelBuilder.Entity<Organization>()
        .HasMany(o => o.Notes)                    // Many Notes
        .WithOptional()                           // No navigation property on Notes            
        .HasForeignKey(n => n.OrganizationId );   // Use OrganizationId as a foreign key

modelBuilder.Entity<Project>()
        .HasMany(o => o.Notes)
        .WithOptional()
        .HasForeignKey(n => n.ProjectId);
于 2013-07-31T14:22:02.047 回答
0

您可以定义没有导航属性的 Note 实体,

public class Note
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ID { get; set; }

    public Guid SourceKey { get; set; }

    [Required(ErrorMessage = "A title is required.")]
    public string Title { get; set; }

    [Column(TypeName = "ntext")]
    public string Value { get; set; }

    public string Tags { get; set; }

    public int OrganizationId { get; set; }
    public int ProjectId { get; set; }
}
于 2013-07-31T03:27:28.087 回答
0

我认为不可能对多个外键使用一列(SourceKey)。它会给你一个错误。我很确定这是可能的,但也许我对 MySQL 中的 MyISAM 表感到困惑。我将按照 Chris 的建议使用 Note 模型中的外键列。谢谢大家。

于 2013-08-08T22:23:59.333 回答
0

如果你不需要导航属性,你可以简单地使用下面的类来定义它:

public class Note
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid NoteID { get; set; }

    public Guid SourceKey { get; set; }

    [Required(ErrorMessage = "A title is required.")]
    public string Title { get; set; }

    [Column(TypeName = "ntext")]
    public string Value { get; set; }

    public string Tags { get; set; }

    public Guid OrganizationId { get; set; }
    public Guid ProjectId { get; set; }

}

注意OrganizationIdProjectId是 类型Guid

于 2013-07-31T05:12:29.930 回答