我试图运行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并对界面进行评论,它就可以正常生成关系。
有没有办法解决这个问题?任何帮助将非常感激。我们已经使用我们喜欢使用的接口构建了大量可重用的架构,但看起来这可能是一个阻碍。
尝试在运行迁移后手动将外键添加到由迁移生成的代码。 – alikuli