1

我有一个.dll,里面有一个类,其中包含一个对象列表(这是来自元数据,我没有源代码):

public class APIKeyInfo
{
    public APIKeyInfo();
    public long AccessMask { get; set; }
    public List<AccountEntry> Characters { get; set; }
    public DateTime Expires { get; set; }
}

public class AccountEntry
{
    public AccountEntry();
    public long CharacterID { get; set; }
    public string Name { get; set; }
    ... other properties
}

现在在我的代码中,我有一个 APIKeyInfo 的扩展类,它使用 EF Code First 指定一个数据库表:

[Table("MyApiKey")]
public class MyApiKey : APIKeyInfo
{
    [Key]
    public int KeyId { get; set; }
    [Required]
    public string vCode { get; set; } 
}

问题是这会导致 EF 给我一个错误,说当它尝试为 APIKeyInfo 中的“列表字符”属性创建一个表时(我假设它只有一个到 MyApiKey 表的 FK),它说密钥有没有被定义。所以,我的问题是,当我无权访问源代码时,如何指定“列表字符”属性的键?我希望有类似的东西:

[Table("MyApiKey")]
public class MyApiKey : APIKeyInfo
{
    [Key]
    public int KeyId { get; set; }
    [Required]
    public string vCode { get; set; } 

    [Key]
    base.Characters.CharacterID;
}

只是告诉它使用哪个属性,但显然这不起作用。

4

1 回答 1

1

我实际上没有尝试过,但我不明白为什么它不起作用。尝试使用 EntityTypeConfiguration 对象而不是使用属性,例如

 public class MyApiKeyMapping : EntityTypeConfiguration<MyApiKey>
 {
     public MyApiKeyMapping()
     {
         this.ToTable("MyApiKey");
         this.HasKey(k => k.KeyId);
         this.Property(p => p.vCode).IsRequired();
     }
}

public class AccountEntryMapping : EntityTypeConfiguration<AccountEntry>
{
    public AccountEntryMapping()
    {
        this.ToTable("AccountEntry");
        this.HasKey(k => k.CharacterId);
    }
}

这应该让您为您不拥有的实体创建映射(希望如此)。

然后在您的上下文中,您只需添加以下内容。

public class MyApiContext : DbContext
{

    ...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new MyApiKeyMapping());
        modelBuilder.Configurations.Add(new AccountEntryMapping());
    }
}

您还可以添加关系和需要设置到映射的任何其他属性。

于 2013-06-20T19:24:54.653 回答