Linq to SQL System.InvalidOperationException:成员AutoSync失败

时间:2010-05-12 15:42:54

标签: c# sql linq-to-sql

我有几个Linq to SQL实体导致我出现问题:

[Table(Name = "ViewName")]
[InheritanceMapping(Code = false, Type = typeof(Entity1), IsDefault = true)]
[InheritanceMapping(Code = true, Type = typeof(Entity2))]
public class Entity1
{
[Column(AutoSync = AutoSync.OnInsert, DbType = "uniqueidentifier NOT NULL", IsPrimaryKey = true, IsDbGenerated = true)]
    public Guid Bssid { get; set; }
    // other properties
[Column(AutoSync= AutoSync.OnInsert ,DbType = "Int NOT NULL IDENTITY", IsDbGenerated = true)]
    public int NewSslid { get; set; } 

}

public class Entity2 : Entity1
{
    public Entity2()
    {
        Discriminator = true;
        _options  = new EntitySet<Entity3>();
    }
}

实体正在使用可更新视图而不是数据库表,因为大约有150个字段分布在两个表中。该视图在所有CRUD函数运行时运行,但在尝试将任一实体类型插入数据库时​​出现以下错误:

  

System.InvalidOperationException:成员AutoSync失败。要使成员在插入后自动同步,该类型必须具有自动生成的标识,或者插入后数据库未修改的密钥。

Entity1的数据库表使用PK和单独的字段(NewSslid)作为标识 - 而后者又用作Entity2字段上的PK。

有人能指出我正确的方向来排除这个错误吗?

2 个答案:

答案 0 :(得分:0)

什么是在Bssid字段上生成GUID,听起来这是由数据库中newid()的defaultvalue设置的。 Link2SQL抱怨说这是在插入后由DB设置的,所以它不能同步它,因为它不知道它被设置为什么值。即没有@@ identity或类似的等同物。

答案 1 :(得分:0)

通过改变Entity1:

public class Entity1
{
    public Entity1()
    {
        Guid = System.Guid.NewGuid();
    }

    [Column(IsDbGenerated = true)]
    public Guid Bssid { get; set; }
    [Column(IsPrimaryKey = true, IsDbGenerated = false, Name = "Guid")]
    public Guid? Guid { get; set; }
    // other properties
    [Column(AutoSync = AutoSync.OnInsert , DbType = "Int NOT NULL IDENTITY", IsDbGenerated = true)]
    public int NewSslid { get; set; }

 }

将'Guid'列添加到Entity1表中,默认值为newid()