0

我有一个我想在数据库中表示的共享类型。我需要先知道是否可以使用代码,或者它是否是糟糕的设计。(请指出你的推理来源)。

这是布局:

public class A
{
    public Guid Id;
    public Guid ParentId; // Points to either B or C
    public string Foo;
}

public class B
{
    public Guid Id;
    public virtual ICollection<A> ManyA { get; set; }
    // Other fields
}

public class C
{
    public Guid Id;
    public virtual ICollection<A> ManyA { get; set; }
    // Other fields
}

我已经通过使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]注释来管理 GUID PK,我相信这将使这成为可能。

目标是保持A-table 简单;我不希望它有B_IdC_Id列,因为我认为它们是不必要的,并且D将来可能会有一种类型,它有很多A就像BC。此外,此方案用于其他一些关系。

我认为问题的精神很明显,但是特定于 EF 的类成员只是为了说明问题。如果他们需要改变,那就这样吧。

(我很抱歉这个人为的例子,但是暴露这个的真实性质,IMO,并没有澄清问题)。

另外,我试着搜索了几个小时!我不知道找到合适答案的正确命名法。一般来说,我对数据库和 EF 很陌生。

4

2 回答 2

0

不用Guid做索引,为什么选择hard-way?:S

像示例一样使用 DataAnnotations:

一类:

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Web.Mvc;

namespace app.Models
{
    [Table("A")]
    public class A
    {

        [Key]
        public int AId { get; set; }

        [Required(ErrorMessage = "Campo obrigatório")]
        [DisplayName("Title")]
        [StringLength(100)]
        public string Title { get; set; }
        public virtual ICollection<B> bCollection { get; set; } 
    }
}

B类:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Web.Mvc;

namespace app.Models
{
    [Table("B")]
    public class B
    {
        [ScaffoldColumn(false)]
        [Key]
        public int BId { get; set; }

        [DisplayName("Description")]
        [StringLength(100)]
        public string Description { get; set; }

        public virtual ICollection<A> AList{ get; set; } 
    }
}

您可以在此处查看更多详细信息:链接!!!有关 EF5 数据注释的更多详细信息:链接

于 2013-02-16T17:44:39.553 回答
0

我发现我可以为B和类型创建一个通用的基本C类型。例如:

class Program
{
    static void Main(string[] args)
    {
        using (var context = new Ctx())
        {
            var b = new B();
            var c = new C();
            b.ManyA.Add(new A());
            c.ManyA.Add(new A());

            context.Cs.Add(c);
            context.Bs.Add(b);

            context.SaveChanges();
        }
    }
}

public class Ctx : DbContext
{
    public DbSet<A> As { get; set; }
    public DbSet<B> Bs { get; set; }
    public DbSet<C> Cs { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<BaseClass>()
            .HasMany<A>(b => b.ManyA)
            .WithRequired(a => a.BaseObject)
            .WillCascadeOnDelete(true);
    }
}

public class BaseClass
{
    public BaseClass() { ManyA = new HashSet<A>(); }

    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public virtual ICollection<A> ManyA { get; set; }
}

public class A
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public BaseClass BaseObject { get; set; }
    public string Foo { get; set; }
}

public class B : BaseClass
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public string SomeProperty { get; set; }
}

public class C : BaseClass
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public int SomeOtherProperty { get; set; }
}

并且,根据这篇 Msdn 文章,将导致 Table Per Hierarchy 数据库布局。TPH 与 TPT 相比表现更好,我认为这可能是一个答案。

我真的希望有更简单的东西,但毕竟性能是底线

于 2013-02-16T20:03:33.707 回答