Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架代码优先-如何定义自定义导航属性_C#_Entity Framework_Navigation Properties - Fatal编程技术网

C# 实体框架代码优先-如何定义自定义导航属性

C# 实体框架代码优先-如何定义自定义导航属性,c#,entity-framework,navigation-properties,C#,Entity Framework,Navigation Properties,我正在使用ASP.NET核心和实体框架 我有一个预先存在的数据库模式,我想使用外键添加一个链接表,但是外键索引列不符合任何标准EF约定。我如何用Ef来表达这一点?如果可能的话,我更喜欢使用数据注释属性,但如果不使用ModelBuilder fluent API,则完全可以使用 基本上是: [Table("widgets")] class Widget { [Key, Column("id")] int Id { get; set; } [Column("referencenumbe

我正在使用ASP.NET核心和实体框架

我有一个预先存在的数据库模式,我想使用外键添加一个链接表,但是外键索引列不符合任何标准EF约定。我如何用Ef来表达这一点?如果可能的话,我更喜欢使用数据注释属性,但如果不使用ModelBuilder fluent API,则完全可以使用

基本上是:

[Table("widgets")]
class Widget {
  [Key, Column("id")]
  int Id { get; set; }

  [Column("referencenumber")]
  int ReferenceNumber { get; set; }

  public WidgetReferenceData ReferenceData // ???? How do I express this?
}

[Table("widgetreferences")]
class WidgetReference {
  [Key, Column("referencenumber")]
  int ReferenceNumber { get; set; }

  [Column("value")]      
  string Value { get;set; }
}
在上述模型中,Widget在WidgetReference表中可能有零个或一个关联条目,使用widgets.referencenumber数据库列链接

我想做的是在我的小部件模型中添加一个属性,以便转到并加载这个关联的WidgetReference,如果没有,则加载null。基本上,我希望能够像这样使用它:

var referenceValue = FindWidget().ReferenceData?.Value;
如果它是一个常规的Id列,EF会处理它,但由于我有自定义的数据库列和属性名,我如何表达这种关系

我不确定它是否会影响结果,但关键是widgetreferences.referencenumber不是外键,而是一个带有索引的列。我们的业务逻辑是,如果小部件被删除,我们仍然希望保留引用数据

我曾尝试通过谷歌搜索找到答案,但没能找到答案,但我觉得这并不难:-

    [Table("widgets")]
    class Widget 
   {
      [Key, Column("id")]
      int Id { get; set; }

      [Column("referencenumber")]
      int? ReferenceNumber { get; set; }

      [ForeignKey("ReferenceNumber")]
      public virtual WidgetReferenceData ReferenceData // ???? How do I express this?
    }

    [Table("widgetreferences")]
    class WidgetReference 
    {
      [Key, Column("referencenumber")]
      int ReferenceNumber { get; set; }

      [Column("value")]      
      string Value { get;set; }
    }

只需使用ForeignKeyAttribute将导航属性与外键属性相关联。EF不在乎后端是否有外键

标题说是代码优先,但正文说是数据库优先?如果你搭建了它,搭建者如何代表你的关系?还是因为你没有FK就不麻烦了?widget和reference的x:y关系是什么?首先是代码。我没有使用edmx映射文件或类似文件。关系是小部件在referencenumber列上有零个或一个引用联接,但引用将在小部件被删除后继续存在?关于这些事情的普遍共识似乎是让EF创建FK,然后将其从DB中删除。我想如果它的键控方式正确,您可以尝试更改它,使其在级联删除类上设置为null,这样您的引用将丢失其widgetid,但看起来您试图以相反的方式关联,并使小部件具有referenceid,如果widget消失,则引用没有widgetid。无论我是否在模型中放入[ForeignKeyReferenceNumber],EF都会生成一个数据库迁移,在WidgetReference和widget之间添加一个显式外键,这不是我想要的。如果您有一个现有的数据库架构,您根本不应该使用迁移。我现有的数据库架构是使用以前的迁移生成的。。。我只想表达一个业务需求可选的额外数据,该数据通过一个辅助键关联,而不会再次破坏所有现有数据。如果您不希望EF修改您的数据库,请不要使用迁移。只需单独管理您的数据库模式。我确实希望EF修改我的数据库,我只是想弄清楚如何告诉EF以正确的方式修改它,这在本例中似乎不可能,至少今天不可能