Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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# EF具有多个可选选项_C#_Entity Framework_Fluent Entity Framework - Fatal编程技术网

C# EF具有多个可选选项

C# EF具有多个可选选项,c#,entity-framework,fluent-entity-framework,C#,Entity Framework,Fluent Entity Framework,我有一个问题,我只是不能解决谷歌或搜索stackoverflow 我有两个表journalline和Accounts,我想在journalline中引用一个account(我讨厌经济学),但是引用必须是可选的,account不应该有任何到journalline的导航属性(理想情况下) 日志行: public class JournalLine : Entity<int> { public int? Account_Id { get; set; } public str

我有一个问题,我只是不能解决谷歌或搜索stackoverflow

我有两个表journalline和Accounts,我想在journalline中引用一个account(我讨厌经济学),但是引用必须是可选的,account不应该有任何到journalline的导航属性(理想情况下)

日志行:

public class JournalLine : Entity<int>
{
    public int? Account_Id { get; set; }
    public string Desc { get; set; }
    public decimal Credit { get; set; }
    public decimal Debit { get; set; }
    public virtual Account Account { get; set; }
}
public class Account : Entity<int>
{
    public string Accid { get; set; }
    public string Desc { get; set; }
    public int VatcodeId { get; set; }
}
public class JournalLineMap : EntityTypeConfiguration<JournalLine>
{
    public JournalLineMap()
    {
        HasKey(k => new { k.Id, k.Account_Id });
        Property(k => k.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        
        ToTable("attJournalLines");
        HasEntitySetName("JournalLines");
        
        HasOptional(jl => jl.Account)
            .WithMany()
            .HasForeignKey(jl => jl.Account_Id);
    }
}

public class AccountMap : EntityTypeConfiguration<Account>
{
    public AccountMap()
    {
        ToTable("attAccounts");
        HasEntitySetName("Accounts");
    }
}
公共类日志行:实体
{
公共int?帐户_Id{get;set;}
公共字符串Desc{get;set;}
公共十进制信用{get;set;}
公共十进制借方{get;set;}
公共虚拟帐户{get;set;}
}
\u账户:

public class JournalLine : Entity<int>
{
    public int? Account_Id { get; set; }
    public string Desc { get; set; }
    public decimal Credit { get; set; }
    public decimal Debit { get; set; }
    public virtual Account Account { get; set; }
}
public class Account : Entity<int>
{
    public string Accid { get; set; }
    public string Desc { get; set; }
    public int VatcodeId { get; set; }
}
public class JournalLineMap : EntityTypeConfiguration<JournalLine>
{
    public JournalLineMap()
    {
        HasKey(k => new { k.Id, k.Account_Id });
        Property(k => k.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        
        ToTable("attJournalLines");
        HasEntitySetName("JournalLines");
        
        HasOptional(jl => jl.Account)
            .WithMany()
            .HasForeignKey(jl => jl.Account_Id);
    }
}

public class AccountMap : EntityTypeConfiguration<Account>
{
    public AccountMap()
    {
        ToTable("attAccounts");
        HasEntitySetName("Accounts");
    }
}
公共类账户:实体
{
公共字符串Accid{get;set;}
公共字符串Desc{get;set;}
公共代码ID{get;set;}
}
和相应的映射:

public class JournalLine : Entity<int>
{
    public int? Account_Id { get; set; }
    public string Desc { get; set; }
    public decimal Credit { get; set; }
    public decimal Debit { get; set; }
    public virtual Account Account { get; set; }
}
public class Account : Entity<int>
{
    public string Accid { get; set; }
    public string Desc { get; set; }
    public int VatcodeId { get; set; }
}
public class JournalLineMap : EntityTypeConfiguration<JournalLine>
{
    public JournalLineMap()
    {
        HasKey(k => new { k.Id, k.Account_Id });
        Property(k => k.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        
        ToTable("attJournalLines");
        HasEntitySetName("JournalLines");
        
        HasOptional(jl => jl.Account)
            .WithMany()
            .HasForeignKey(jl => jl.Account_Id);
    }
}

public class AccountMap : EntityTypeConfiguration<Account>
{
    public AccountMap()
    {
        ToTable("attAccounts");
        HasEntitySetName("Accounts");
    }
}
公共类日志映射:EntityTypeConfiguration
{
公共期刊地图(
{
HasKey(k=>new{k.Id,k.Account\u Id});
属性(k=>k.Id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
ToTable(“attJournalLines”);
HasEntitySetName(“日记行”);
HAS可选(jl=>jl.Account)
.有很多
.HasForeignKey(jl=>jl.Account\u Id);
}
}
公共类AccountMap:EntityTypeConfiguration
{
公共帐户映射()
{
ToTable(“附件”);
HasEntitySetName(“账户”);
}
}
我得到的错误如下:

在模型生成过程中检测到一个或多个验证错误:

tSystem.Data.Entity.Edm.edmsociationType::多重性与关系“JournalLine\u Account”中角色“JournalLine\u Account\u Target”中的引用>约束冲突。“>由于从属角色中的所有属性都不可为null,因此>主体角色的多重性必须为“1”

这使我感到困惑,我希望有人能阐明这个问题

更新
谢谢你的回答,它在路上帮了我的忙,我拔下钥匙就找到了工作的关系。然后,当将
帐户
分配给
日志行
时,我得到了一个wierd行为,创建了一个重复的帐户。事实证明,这并不是什么奇怪的行为,因为我使用的是依赖注入的存储库模式。我没有想到的是,这两个存储库中的上下文并不相同,因此JournalLinesRepository没有跟踪我从其自己的存储库中获取的帐户,因此认为将其作为新实体插入是明智的。这是通过在存储库中注入相同的上下文来解决的,因此项目跟踪可以按预期工作。再次感谢您的帮助。

通过查看您的代码,它“感觉”像是HasKey(k=>new{k.Id,k.Account\u Id})可能会导致问题,因为
帐户\u Id
可为空,并且通常不接受为密钥。尝试删除Account_Id的nullable标志,看看会发生什么

编辑:EF中的键

一个键在其组合中总是需要是唯一的(如果您有多个列和键)。这就是为什么不能允许键参数为空值的基本规则


当您将Account_Id指定为更向下的外键时,您已经为它添加了一个键,那么为什么还要将其作为主键呢?特别是因为您允许它为空?

通过查看代码,它“感觉”像是HasKey(k=>new{k.Id,k.Account\u Id})可能会导致问题,因为
帐户\u Id
可为空,并且通常不接受为密钥。尝试删除Account_Id的nullable标志,看看会发生什么

编辑:EF中的键

一个键在其组合中总是需要是唯一的(如果您有多个列和键)。这就是为什么不能允许键参数为空值的基本规则

当您将Account_Id指定为更向下的外键时,您已经为它添加了一个键,那么为什么还要将其作为主键呢?特别是因为您允许它为null?

正确地识别了这个问题——您不能拥有具有可为null列的复合主键。这就提出了一些关于您试图建模的问题

除了主键之外,您的模型似乎还能工作。事实上,我认为只要删除HasKey(k=>new{k.Id,k.Account\u Id})将使事情顺利进行。如果这样做,则每个
日志行
都将有自己的唯一ID,并且可以选择与
帐户
相关

这将产生如下数据:

| AccountId | Desc         |
| 123456789 | Some Account |

| JournalId | AccountId | Description | Credit | Debit |
|         1 |      null |     Some Tx | 100.00 |   0.0 |
|         2 | 123456789 |  Another Tx |    0.0 |  50.0 |
|         3 | 123456789 |      MoreTx |  10.00 |   0.0 |
另一方面,如果您在
日志行
键中使用
AccountId
的原因是为了暗示每个帐户都有自己的日志(从我的帐户类听起来似乎很熟悉),那么您的建模需要一些调整——或者您可能需要一个特殊的“未分类”account专门用于处理未应用于特定帐户的事务。

正确识别了该问题——您不能使用具有可空列的复合主键。这就提出了一些关于您试图建模的问题

除了主键之外,您的模型似乎还能工作。事实上,我认为只要删除HasKey(k=>new{k.Id,k.Account\u Id})将使事情顺利进行。如果这样做,则每个
日志行
都将有自己的唯一ID,并且可以选择与
帐户
相关

这将产生如下数据:

| AccountId | Desc         |
| 123456789 | Some Account |

| JournalId | AccountId | Description | Credit | Debit |
|         1 |      null |     Some Tx | 100.00 |   0.0 |
|         2 | 123456789 |  Another Tx |    0.0 |  50.0 |
|         3 | 123456789 |      MoreTx |  10.00 |   0.0 |
另一方面,如果您在
日志行
键中使用
AccountId
的原因是为了暗示每个帐户都有自己的日志(从我的帐户类听起来似乎很熟悉),那么您的建模需要一些调整——或者您可能需要一个特殊的“未分类”专门用于处理未应用于特定帐户的交易的帐户。

什么是<