2015-11-17 102 views
2

我试图运行EF代码优先使用属性/注释方法与接口作为属性类型的迁移。我们已经用接口构建了一个完整的基础架构,并且正在使用这些架构来实现具体的类并希望启用迁移。 EF似乎没有正确地关联外键关系。有什么方法可以纠正这个问题吗?实体框架代码与接口的第一次迁移

下面是一个例子:

我有一个IStateProvince界面如下:

public interface IStateProvince 
{ 

    string Abbreviation { get; set; } 

    string Name { get; set; } 

    ICountry Country { get; set; } 

} 

我也有一个ICountry界面如下:

public interface ICountry 
{ 

    string Name { get; set; } 

    [MaxLength(2)] 
    string TwoLetterIsoCode { get; set; } 

    [MaxLength(3)] 
    string ThreeLetterIsoCode { get; set; } 

    int NumericIsoCode { get; set; } 

    List<IStateProvince> StateProvinces { get; set; } 
} 

我已经创建具体实现如如下:

[Table("TypeData.Country")] 
public class Country : BaseSqlEntity, ICountry 
{ 

    [Required, MaxLength(250)] 
    public string Name { get; set; } 

    [Required] 
    public string TwoLetterIsoCode { get; set; } 

    [Required] 
    public string ThreeLetterIsoCode { get; set; } 

    public int NumericIsoCode { get; set; } 

    public virtual List<IStateProvince> StateProvinces { get; set; } 

} 

国家省如下:

[Table("TypeData.StateProvince")] 
public class StateProvince : BaseSqlEntity, IStateProvince 
{ 

    [Required, MaxLength(3)] 
    public string Abbreviation { get; set; } 

    [Required, MaxLength(250)] 
    public string Name { get; set; } 

    public Guid CountryId { get; set; } 

    [ForeignKey("CountryId")] 
    public virtual ICountry Country { get; set; } 

} 

您所看到的BaseSqlEntity如下:

public class BaseSqlEntity 
{ 
    [Key] 
    public Guid Id { get; set; } 

    public DateTime DateCreatedUtc { get; set; } 

    public DateTime DateModifiedUtc { get; set; } 

    public BaseSqlEntity() 
    { 
     DateCreatedUtc = DateModifiedUtc = DateTime.UtcNow; 
     Id = Guid.NewGuid(); 
    } 

} 

我已经添加在上下文中dbsets如下:

public DbSet<Country> Countries { get; set; } 
public DbSet<StateProvince> StateProvinces { get; set; } 

在运行迁移,我得到以下内容:

public override void Up() 
    { 
     CreateTable(
      "TypeData.Country", 
      c => new 
       { 
        Id = c.Guid(nullable: false), 
        Name = c.String(nullable: false, maxLength: 250), 
        TwoLetterIsoCode = c.String(nullable: false), 
        ThreeLetterIsoCode = c.String(nullable: false), 
        NumericIsoCode = c.Int(nullable: false), 
        DateCreatedUtc = c.DateTime(nullable: false), 
        DateModifiedUtc = c.DateTime(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id); 

     CreateTable(
      "TypeData.StateProvince", 
      c => new 
       { 
        Id = c.Guid(nullable: false), 
        Abbreviation = c.String(nullable: false, maxLength: 3), 
        Name = c.String(nullable: false, maxLength: 250), 
        CountryId = c.Guid(nullable: false), 
        DateCreatedUtc = c.DateTime(nullable: false), 
        DateModifiedUtc = c.DateTime(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id); 

    } 

正如您将会注意到的那样,没有外键关系生成,因为它不能以某种方式将ICountry与其实施国相关联。

如果我将ICountry的类型更改为Country并对界面进行评论,它就可以正常生成关系。

有没有办法解决这个问题?任何帮助将非常感激。我们已经使用我们喜欢使用的接口构建了大量可重用的架构,但看起来这可能是一个阻碍。

+0

尝试在运行迁移后手动将外键添加到由迁移生成的代码。 – alikuli

回答

4

您仍然可以使用这些接口。
只需要在具体类中实现接口属性如下。

[Table("TypeData.Country")] 
public class Country : BaseSqlEntity, ICountry 
{ 

    [Required, MaxLength(250)] 
    public string Name { get; set; } 

    [Required] 
    public string TwoLetterIsoCode { get; set; } 

    [Required] 
    public string ThreeLetterIsoCode { get; set; } 

    public int NumericIsoCode { get; set; } 

    public virtual List<StateProvince> StateProvinces { get; set; } 

    List<IStateProvince> ICountry.StateProvinces 
    { 
     get 
     { 
      return StateProvinces.ToList<IStateProvince>(); 
     } 

     set 
     { 
      StateProvinces = value.ToList().ConvertAll(o => (StateProvince)o); 
     } 
    } 
} 

[Table("TypeData.StateProvince")] 
public class StateProvince : BaseSqlEntity, IStateProvince 
{ 

    [Required, MaxLength(3)] 
    public string Abbreviation { get; set; } 

    [Required, MaxLength(250)] 
    public string Name { get; set; } 

    public Guid CountryId { get; set; } 

    [ForeignKey("CountryId")] 
    public virtual Country Country { get; set; } 

    ICountry IStateProvince.Country 
    { 
     get 
     { 
      return Country; 
     } 

     set 
     { 
      Country = (Country)value; 
     } 
    } 
} 

希望这会解决您的问题。

+0

感谢您的回应!这样可行。我真的希望有一个简单的方法来做这样的事情,比如[ForeignKey(“CountryId”),typeof(Country)],这会让事情变得容易多了! –

相关问题