1

我有以下内容:

public abstract class InputBase
{
    public virtual ICollection<Data> Data { get; set; }
}

public class InputA: InputBase { }

public class InputB: InputBase { }

public abstract class Data
{
    public virtual InputA InputA { get; set; }
    public virtual InputB InputB { get; set; }
}

InputA 和 InputB 都使用 InputBase 的数据集合。

数据将始终具有 InputA 和 InputB 的实例。

我尝试通过以下方式将其链接起来:

modelBuilder.Entity<Data>()
    .HasRequired(data => data.InputA)
    .WithMany(input => input.Data)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Data>()
    .HasRequired(data => data.InputB)
    .WithMany(input => input.Data)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<InputA>()
    .HasRequired(input => input.Data)
    .WithRequired(data => data.InputA)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<InputB>()
    .HasRequired(input => input.Data)
    .WithRequired(data => data.InputB)
    .WillCascadeOnDelete(false);

但是,我收到 MetaDataException,错误 0040:类型 Data_InputA 未在命名空间中定义(...)

我怎样才能使这项工作?我不想在输入衍生品上创建单独的数据集合,因为这在逻辑上是不正确的。

4

1 回答 1

0

这应该可以解决您的问题:

改变这个:

public abstract class Data
{
   public virtual InputA InputA { get; set; }
   public virtual InputB InputB { get; set; }
}

致:如果你担心foreign key,没关系。KeyofInputA ObjectInputBase Object我们使用Inheritance. 因此,Data Structure指示我们执行以下操作。

public abstract class Data
{
   [ForeignKey("InputBase"), DatabaseGenerated(DatabaseGeneratedOption.None)]
   public int? InputBaseId { get; set; }

   public virtual InputBase InputBase { get; set; }       
}

如果你InheritanceTable per Type (TPT)

对派生类执行此操作:

[Table("InputB")] //This is what your table will be named in your database for derived class
public class InputA: InputBase { }

[Table("InputB")]
public class InputB: InputBase { }

你也不需要这个:

modelBuilder.Entity<Data>()
.HasRequired(data => data.InputA)
.WithMany(input => input.Data)
.WillCascadeOnDelete(false);

modelBuilder.Entity<Data>()
.HasRequired(data => data.InputB)
.WithMany(input => input.Data)
.WillCascadeOnDelete(false);

modelBuilder.Entity<InputA>()
.HasRequired(input => input.Data)
.WithRequired(data => data.InputA)
.WillCascadeOnDelete(false);

modelBuilder.Entity<InputB>()
.HasRequired(input => input.Data)
.WithRequired(data => data.InputB)
.WillCascadeOnDelete(false);

您可以删除该部分,因为我们使用了Property Mapping.

于 2013-04-08T05:35:14.560 回答